C++ 基于模板类型使类成员变量可选的非详细解决方案?
我希望仅当类使用模板类型int实例化时,才定义类成员变量C++ 基于模板类型使类成员变量可选的非详细解决方案?,c++,templates,c++17,C++,Templates,C++17,我希望仅当类使用模板类型int实例化时,才定义类成员变量only_if int。我有一个可行的解决方案,但它太冗长了 #include <iostream> #include <type_traits> template<typename T, typename Enable = void> class MyClass; template<typename T> class MyClass<T, std::enable_if_t<s
only_if int
。我有一个可行的解决方案,但它太冗长了
#include <iostream>
#include <type_traits>
template<typename T, typename Enable = void>
class MyClass;
template<typename T>
class MyClass<T, std::enable_if_t<std::is_same<T, int>::value>>{
public:
int common;
int only_if_int;
MyClass()
{
common = 0;
only_if_int = 0;
}
void alter_values()
{
common++;
only_if_int++;
}
};
template<typename T>
class MyClass<T, std::enable_if_t<!std::is_same<T, int>::value>>{
public:
int common;
MyClass()
{
common = 0;
}
void alter_values()
{
common++;
}
};
int main()
{
MyClass<int> int_class;
MyClass<float> float_class;
int_class.alter_values();
float_class.alter_values();
std::cout<<"\n int_class "<<int_class.common<<" "<<int_class.only_if_int;
std::cout<<"\n int_class "<<float_class.common<<" ";
return 0;
}
#包括
#包括
模板
类MyClass;
模板
类MyClass{
公众:
int通用;
仅限int如果int;
MyClass()
{
公共=0;
仅当_int=0时;
}
void alter_值()
{
通用++;
仅当int++;
}
};
模板
类别MyClass>{
公众:
int通用;
MyClass()
{
公共=0;
}
void alter_值()
{
通用++;
}
};
int main()
{
MyClass int_类;
MyClass浮动\ U类;
int_class.alter_values();
float_类。alter_值();
std::cout一种方法是,只有在用int
实例化时,才使用包含int
成员的类型,如下所示:
template<typename>
struct OnlyInt {};
template<>
struct OnlyInt<int> {
int only_if_int;
};
现在,仅当int
时的所有用法都需要包装在if constexpr
中,并且您必须使用this->
来指示成员来自基类。例如:
only_if_int = 0;
变成:
if constexpr (std::is_same_v<T, int>)
this->only_if_int = 0;
如果constexpr(std::is_same_v)
此->仅当_int=0时;
等等
这里有一个。这不仅仅是一个额外的类成员。所有的方法也必须改变。虽然有一些更简单的方法来添加类成员,但这在这里是不够的。@JeJo我在c++14之前都很好。如果你不能使用c++17,那么你就不能使用if constexpr
。如果没有这些方法,整个类的专门化就相当干净了你可以得到。(也许从基类继承会有帮助)。对不起,我在c++17之前都很好
if constexpr (std::is_same_v<T, int>)
this->only_if_int = 0;