是否可以定义两个具有相同名称的不同模板(按模板参数数量)?
这是我想要做的:
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它的可变参数模板允许它更加漂亮,但我没有时间玩这个,所以我最好把它留给其他人展示.
要显示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)
现在,您可以按照您喜欢的顺序添加特化,而无需修改其他模板(除非模板参数的数量/类型冲突).
我认为你可以使用一个类模板,为第二个模板参数提供默认类型参数:
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)
| 归档时间: |
|
| 查看次数: |
311 次 |
| 最近记录: |