提问人:Cobollatin 提问时间:6/28/2023 更新时间:6/28/2023 访问量:68
如何将预处理器指令扩展到调用预处理器指令的位置之外
How to expand a preprocessor directive outside where it was called
问:
我正在试验编译时枚举断言,我想出了以下代码:
template<int Value>
inline constexpr bool isValueUsed(){
return false;
}
class BaseEnum{
private:
constexpr BaseEnum(int value): _value(value){
}
public:
template<int value>
constexpr static BaseEnum CreateEnum() {
static_assert(!isValueUsed<value>(), "The value is already used");
return BaseEnum(value);
}
constexpr BaseEnum& operator=(const BaseEnum& other){
return *this;
}
// public for testing purposes
int _value;
};
namespace BaseEnumValues {
constexpr BaseEnum Default = BaseEnum::CreateEnum<0>();
}
#include <iostream>
int main(){
// Tests Definition
BaseEnum baseEnum1 = BaseEnumValues::Default;
BaseEnum baseEnum2 = BaseEnum::CreateEnum<1>();
// Should fail to compile
// BaseEnum baseEnum3 = BaseEnum::CreateEnum<1>();
std::cout << "BaseEnum1: " << baseEnum1._value << std::endl;
std::cout << "BaseEnum2: " << baseEnum2._value << std::endl;
return 0;
}
现在,我想在每次调用时都创建模板的专用化,但是我不知道该怎么做,我实现了一个预处理器指令,该指令将扩展到专用化,但是我在函数内部调用它,因此它将在那里扩展,有没有办法将指令扩展到调用位置之外?CreateEnum<>
#define DEFINE_ENUM_VALUE(value) \
template<> \
inline constexpr bool isValueUsed<value>(){ \
return true; \
}
template<int value>
constexpr static BaseEnum CreateEnum() {
static_assert(!isValueUsed<value>(), "The value is already used");
DEFINE_ENUM_VALUE(value) // This should be expanded elsewhere in the code
return BaseEnum(value);
}
关于如何解决这个问题的任何想法?
答: 暂无答案
上一个:定义模板规范时无法推断的模板参数
下一个:如何解决这种可变参数模板歧义
评论
enum1.cpp
enum2.cpp
enum1.cpp
enum2.cpp
enum2.cpp
enum1.cpp