Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 基于模板类型使类成员变量可选的非详细解决方案?_C++_Templates_C++17 - Fatal编程技术网

C++ 基于模板类型使类成员变量可选的非详细解决方案?

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

我希望仅当类使用模板类型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<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;