gpt4 book ai didi

c++ - 初始化列表中的编译时替换

转载 作者:行者123 更新时间:2023-11-27 23:53:48 28 4
gpt4 key购买 nike

我有一个模板类,确保基本上只用 2 个枚举中的 1 个实例化。现在我想根据实例化它的枚举在初始化程序中设置模板参数的值。像这样:

enum class MyFirstEnum { red, green, orange };
enum class MySecondEnum { blue, yellow, red };

template <class T>
class MyClass
{
static_assert(
std::is_same<T, MyFirstEnum>::value || std::is_same<T, MySecondEnum>::value,
"Template parameter must be either MyFirstEnum or MySecondEnum"
);
public:
MyClass()
: value(std::is_same<T, MyFirstEnum>::value ? MyFirstEnum::red : MySecondEnum::blue)
{
}
private:
T value;

}

但是编译器当然会提示,因为类型不匹配并且三元不是编译时的替代品。有没有办法根据类型参数分配正确的值?

感谢任何帮助。我仅限于 c++11

最佳答案

在你的例子中,MyFirstEnum::redMySecondEnum::blue 的值都是 0,所以试试这个:

MyClass() 
: value(static_cast<T>(0))
{
}

或者只是:

MyClass() 
: value(0)
{
}

或者,让编译器为您零初始化该值:

MyClass() 
: value()
{
}

另一方面,如果不能保证初始值始终为 0,那么我建议为每个 enum 定义一个 traits 结构并让它们指定所需的默认值:

enum class MyFirstEnum { red, green, orange };
enum class MySecondEnum { blue, yellow, red };

template<typename T>
struct MyClass_traits
{
};

template<>
struct MyClass_traits<MyFirstEnum>
{
static const MyFirstEnum initial_value = MyFirstEnum::red;
};

template<>
struct MyClass_traits<MySecondEnum>
{
static const MySecondEnum initial_value = MySecondEnum::yellow;
};

template <class T, typename traits = MyClass_traits<T> >
class MyClass
{
static_assert(
!(std::is_same<T, MyFirstEnum>::value || std::is_same<T, MySecondEnum>::value),
"Template parameter must be either MyFirstEnum or MySecondEnum"
);

public:
MyClass()
: value(traits::initial_value)
{
}

private:
T value;
};

关于c++ - 初始化列表中的编译时替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44191575/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com