c++11模板元编程-在编译时声明类型特性(类似开关的情况)

c++11 template metaprogramming - Declaring a Type Trait at compilation time (switch like case)

本文关键字:开关 情况 类型 声明 编程 编译 c++11      更新时间:2023-10-16

我正在尝试实现一个类选择器,这个类的功能是在编译时选择类的特定特性。但我遇到了问题另一个要求是不需要实现静态函数。我在元编程方面的经验很低。

#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成员函数,并使用后面跟着::的类名调用它,而不使用对象。