具有重复名称的类模板

Class templates with duplicate names?

本文关键字:      更新时间:2023-10-16

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

以下是我要做的:

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

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

我知道这可以在C#中完成,但不确定C++。有人能在这里放些光吗?

我认为部分专业化可以做到这一点:

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

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

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

显示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;
  };
}

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

我认为你可以让它与一个类模板一起工作,为第二个模板参数提供默认类型参数:

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

我相信这样的东西也会起作用,但拥有单独的类可能不是你想要的:

   namespace MyNamespace
   {
      class AbstractFunctionObject
      {
         //shared functionality here
      };
      template<class TRet>
      class ConcreteFunctionObjectA : AbstractFunctionObject
      {
         typedef typename TRet ReturnType;
         virtual ReturnType const operator()() const = 0;
      };

      template<class TRet, class TArg0>
      class ConcreteFunctionObjectB : AbstractFunctionObject
      {
         typedef typename TRet ReturnType;
         typedef typename TArg0 FirstArgumentType;
         virtual ReturnType const operator()(FirstArgumentType const &arg) const = 0;
      };
   }
相关文章:
  • 没有找到相关文章