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();
}
};