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++;模板问题_C++_Templates - Fatal编程技术网

C++ C++;模板问题

C++ C++;模板问题,c++,templates,C++,Templates,有没有办法达到规定的行为?如果有什么诀窍,或者可以使用traits或enable\u(如果),请告诉我 模板结构函数{ T运算符()()常量{ Tα(5); //我想把这句话翻译成 //如果T=void,则为普通“return;” 返回一个;//仅为void专门化: template <typename T> struct Functional { T operator()() const { T a(5); return a; } }; temp

有没有办法达到规定的行为?如果有什么诀窍,或者可以使用traits或
enable\u(如果
),请告诉我

模板结构函数{
T运算符()()常量{
Tα(5);
//我想把这句话翻译成
//如果T=void,则为普通“return;”

返回一个;//仅为void专门化:

template <typename T> struct Functional {
   T operator()() const {
      T a(5);
      return a;
   }
};
template <> struct Functional<void> {
   void operator()() const {
   }
};
模板结构函数{
T运算符()()常量{
Tα(5);
返回a;
}
};
模板结构函数{
void运算符()()常量{
}
};

您可以使用专门化


template <> struct Functional<void> {

   void operator()() const {
   }
};

模板<>struct Functional{
void运算符()()常量{
}
};
这应该行得通

template <> struct Functional<void> //specialized for 'void'
{
   void operator()() const {

       //do something

      return ; //optional
   }
};
template struct Functional//专门用于“void”
{
void运算符()()常量{
//做点什么
return;//可选
}
};
编辑:

您还可以编写(更简单的方法)

T运算符()()常量{
返回T(5);//甚至不需要static_cast
}

此代码的问题比第一次出现的问题更大。例如,如果要将Functional的返回值转发给另一个函数,那么您不能只为void指定Functional-整个批次都必须为void指定,因为如果您有一个取void的函数,则无法向其传递void表达式。当然,您可以不能创建带有void之类的变量。总的来说,说void是非法的要比处理它容易


还有其他一些答案已经有了明确的专门化答案。

只需说以下几点。它与
T
being
void
非常有效,与您显示的代码相同

T operator()() const {
  return static_cast<T>(5);
}
T运算符()()常量{
返回静态_-cast(5);
}

您可以在返回
void
的函数中返回
void
表达式,因此在这一点上您没有问题,您的函数的其余部分有一个更大的问题。
ta(5)
行不通。你不能使用
void
类型的变量,因此简单的
返回a;
行不通。如果不知道类模板的详细信息,就很难给出具体信息。+1:我想大多数人都不知道你可以从函数中
返回
void
类型的表达式h返回类型为
void
@Johannes:static_cast
是必需的吗?
T操作符()()可以改为const{return T(T)}
。@prason-Saurav:表达式e可以使用static_cast(e)形式的static_cast显式转换为类型T,如果声明为“T(e);”对于一些发明的临时变量t(8.5),它的格式是正确的。所以两者都是相同的。当然你不能这样做(void v(5)),这就是为什么我猜标准中有一个关于转换为void的明确注释(在static_cast下).我喜欢静态的演员阵容,因为它的explicitness@Chubsdad:不,我的观点是,尽管静态演员阵容很好,但这并不是必须的。@prason许多人认为C型演员阵容很差。尽管我不是那种人(我相信C型演员阵容没有一些人所说的那么差)我认为,在泛型代码中,人们应该真正使用C++风格的转换,因为人们不知道什么类型的代码<代码> t>代码>。
T operator()() const {

   return T(5); // static_cast<> not even required
}
T operator()() const {
  return static_cast<T>(5);
}