具有重复名称的类模板
Class templates with duplicate names?
是否可以定义两个具有相同名称的不同模板类(根据模板参数的数量)?
以下是我要做的:
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;
};
}
相关文章:
- 没有找到相关文章