c++11模板元编程-在编译时声明类型特性(类似开关的情况)
c++11 template metaprogramming - Declaring a Type Trait at compilation time (switch like case)
我正在尝试实现一个类选择器,这个类的功能是在编译时选择类的特定特性。但我遇到了问题另一个要求是不需要实现静态函数。我在元编程方面的经验很低。
#include <stdio.h>
#include <iostream>
template<class OptionSelected>
struct ContainnerValue
{
typedef OptionSelected selectedValue;
typename selectedValue value;
};
////Enum definition
enum class EOptions
{
Option_One,
Option_two
};
////trait base definition
template<EOptions>
struct SelectorClass{};
template<>
struct SelectorClass<EOptions::Option_One>
{
void printClass()
{
std::cout<<"Class Selection One"<<std::endl;
}
};
typedef SelectorClass<EOptions::Option_One> Option_One;
template<>
struct SelectorClass<EOptions::Option_two>
{
void printClass()
{
std::cout<<"Class Selection two"<<std::endl;
}
};
typedef struct SelectorClass<EOptions::Option_two> Option_Two;
int main(void)
{
ContainnerValue<Option_One>::value.printClass();
printf("Hello World!n");
return 0;
}
我觉得这是一种非常复杂的方式来做你想做的事情,但无论如何,这里有一组最简单的更改来实现这一点:更改以下行
typename selectedValue value;
void printClass()
ContainnerValue<Option_One>::value.printClass();
至
typedef selectedValue value;
static void printClass()
ContainnerValue<Option_One>::value::printClass();
也就是说,使printClass
成为static
成员函数,并使用后面跟着::
的类名调用它,而不使用对象。
相关文章:
- 在 c++ 中在开关情况下使用和不使用"break"时的不同输出
- C++ 模板类:运行时给出的模板参数,如何避免重复大开关情况?
- 如果在开关情况下不匹配,为什么此函数返回 ASCII 值?
- 在开关情况下返回布尔值
- 状态机与开关情况
- 开关情况不起作用
- C :嵌套开关情况
- 如何在开关情况下消除对goto的使用
- 在开关情况下可以默认返回 cin
- 在不包括C++的开关情况下使用范围
- C :在开关情况下进行循环
- C++如何对开关情况进行异常处理
- 为什么编译器不允许我在开关情况下使用变量?
- 通过使用函子数组来摆脱开关情况
- 如果我们在需要整数的开关情况下输入字符会发生什么
- 开关情况下的字符和 int 有什么区别?
- 初始化各种开关情况下的变量
- 从C++中的开关情况返回二维数组
- 如何在开关情况下使用多个值
- 寻找一个宏添加两个字符在一起的开关情况