具有重复名称的类模板?

use*_*762 9 c++ templates

是否可以定义两个具有相同名称的不同模板(按模板参数数量)?

这是我想要做的:

namespace MyNamespace
{

template<class TRet>
class FunctionObject
{
    typedef typename TRet ReturnType;
    virtual ReturnType const operator()() const = 0;
};


template<class TRet, class TArg0>
class FunctionObject
{
    typedef typename TRet ReturnType;
    typedef typename TArg0 FirstArgumentType;
    virtual ReturnType const operator()(FirstArgumentType const &arg) const = 0;
};

}
Run Code Online (Sandbox Code Playgroud)

我在第二个FunctionObject结构定义的右括号末尾提到了太多模板参数的错误.

我知道这可以在C#中完成,但对C++不确定.有人可以在这里说清楚吗?

sbi*_*sbi 11

我认为部分专业化可以解决这个问题:

namespace MyNamespace {

  template<class TRet, class TArg0>
  class FunctionObject
  {
      typedef typename TRet ReturnType;
      typedef typename TArg0 FirstArgumentType;
      virtual ReturnType const operator()(FirstArgumentType const &arg) const = 0;
  };

  template<class TRet>
  class FunctionObject<TRet,void>
  {
      typedef typename TRet ReturnType;
      virtual ReturnType const operator()() const = 0;
  };

}
Run Code Online (Sandbox Code Playgroud)

您也可以从具有多个参数的主模板开始.

我认为C++ 11它的可变参数模板允许它更加漂亮,但我没有时间玩这个,所以我最好把它留给其他人展示.


bam*_*s53 6

要显示sbi建议的可变参数模板解决方案:

namespace MyNamespace {

  template<typename...> FunctionObject;

  template<class TRet, class TArg0>
  class FunctionObject<TRet,TArg0>
  {
      typedef typename TRet ReturnType;
      typedef typename TArg0 FirstArgumentType;
      virtual ReturnType const operator()(FirstArgumentType const &arg) const = 0;
  };

  template<class TRet>
  class FunctionObject<TRet>
  {
      typedef typename TRet ReturnType;
      virtual ReturnType const operator()() const = 0;
  };

}
Run Code Online (Sandbox Code Playgroud)

现在,您可以按照您喜欢的顺序添加特化,而无需修改其他模板(除非模板参数的数量/类型冲突).


Naw*_*waz 5

我认为你可以使用一个类模板,为第二个模板参数提供默认类型参数:

struct null_type {};

template<class TRet, class TArg0 = null_type>
class FunctionObject
{
    typedef typename TRet ReturnType;
    typedef typename TArg0 FirstArgumentType;

    //both functions here
    virtual ReturnType const operator()() const = 0;

    virtual ReturnType const operator()(FirstArgumentType const &arg) const = 0;
};
Run Code Online (Sandbox Code Playgroud)

  • 有点正确的方向,但不是那里.这将允许使用带有一个或两个参数的模板,但在原始问题中,两个模板的定义似乎完全不同(不同的成员,`operator()`的不同签名)似乎表明*specialization*将是要走的路.与sbi的答案相比,这个有一个很好的特性,即创建一个*unique*类型(`null_type`应该是唯一的),因此允许使用`void`作为两个参数特化的第二个参数,这很好(+1为了那个原因) (3认同)