C++ 检查结构中的模板类型

C++ 检查结构中的模板类型,c++,templates,struct,C++,Templates,Struct,我想根据模板中的类型在结构中定义其他变量,如下所示: template<typename CONFIG> struct Test { int a; int b; if (std::is_same<CONFIG, MyClass>::value) { // additional variables if the CONFIG type is MyClass int c; int d;

我想根据模板中的类型在结构中定义其他变量,如下所示:

template<typename CONFIG>
struct Test
{
    int a;
    int b;

    if (std::is_same<CONFIG, MyClass>::value) 
    {
        // additional variables if the CONFIG type is MyClass
        int c;
        int d;
    }

    // functions
    void func()
    {
        a = 0;
        b = 0;
        if (std::is_same<CONFIG, MyClass>::value)
        {
            c = 0;
            d = 0;
        }
    }
}
模板
结构测试
{
INTA;
int b;
if(std::is_same::value)
{
//配置类型为MyClass时的其他变量
INTC;
int d;
}
//功能
void func()
{
a=0;
b=0;
if(std::is_same::value)
{
c=0;
d=0;
}
}
}

我该怎么做?谢谢

这是模板专门化的一个用例。您有一个主模板,如

template<typename CONFIG>
struct Test
{
    int a;
    int b;

    // functions
    void func()
    {
        a = 0;
        b = 0;
    }
};

伪代码后面的一个变体(并不是说它比另一个答案更好):

模板
结构TestAdditionalMembers{};
模板
结构TestAdditionalMembers
{
INTC;
int d;
};
模板
结构测试:TestAdditionalMembers
{
INTA;
int b;
//功能
void func()
{
a=0;
b=0;
如果constexpr(std::is_same::value)
{
这个->c=0;
这个->d=0;
}
}
};
额外的成员是通过类模板的继承和显式专门化提供的。由于
c
d
不是依赖名称,但仅存在于某些模板参数中,因此需要使用
this->c
等引用它们(
this
始终是依赖名称)


在函数内部,如果constexpr,则需要通过
检查条件,因为在运行时检查将太晚。(即使条件始终为false,
if
中的代码也必须编译。)

基于walnuts answer,如果要避免类型特征和constepr if,可以在继承的专门化中收集所有条件操作和成员变量

template<typename T>
struct completions {
    void func_completion() {} // does nothing
};

template<>
struct completions<MyClass> {
    int c;
    int d;
    void func_completion() {
        c = 0;
        d = 0;
    }
};

template<typename CONFIG>
struct Test : completions<CONFIG> {
    int a;
    int b;

    // functions
    void func() {
        a = 0;
        b = 0;
        this->func_completion();
    }
};
模板
结构完成{
void func_completion(){}//不执行任何操作
};
模板
结构完成{
INTC;
int d;
void func_completion(){
c=0;
d=0;
}
};
模板
结构测试:完成{
INTA;
int b;
//功能
void func(){
a=0;
b=0;
此->函数完成();
}
};

您不能在运行时修改类/结构的内容。它必须是编译时常量。您可以使用模板专门化,但不使用模板,只需定义一个单独的
MyClassTest
,其中包含额外的成员,就可以用更少的复杂性实现同样的效果。谢谢!这很有帮助!根据模板化类型的结构,可以通过让
Test
Test
继承一些
T
(例如,这里的
void
)来减少代码重复。在更困难的情况下(例如,实际使用的是
CONFIG
),可以创建一个模板基类,其中包含所有模板规范通用的代码。
template<typename CONFIG>
struct TestAdditionalMembers {};

template<>
struct TestAdditionalMembers<MyClass>
{
    int c;
    int d;
};

template<typename CONFIG>
struct Test : TestAdditionalMembers<CONFIG>
{
    int a;
    int b;

    // functions
    void func()
    {
        a = 0;
        b = 0;
        if constexpr(std::is_same<CONFIG, MyClass>::value)
        {
            this->c = 0;
            this->d = 0;
        }
    }
};
template<typename T>
struct completions {
    void func_completion() {} // does nothing
};

template<>
struct completions<MyClass> {
    int c;
    int d;
    void func_completion() {
        c = 0;
        d = 0;
    }
};

template<typename CONFIG>
struct Test : completions<CONFIG> {
    int a;
    int b;

    // functions
    void func() {
        a = 0;
        b = 0;
        this->func_completion();
    }
};