考虑下面这个例子,其中有两个互相依赖的模板类:
template <class T1, class T2, typename = typename std::enable_if<std::is_blah<T1>::value>::type, typename = typename std::enable_if<std::is_blah<T2>::value>::type>
class someClass
{
// ...
template <class U1, class U2, typename = typename std::enable_if<is_blah<U1>::value>::type, typename = typename std::enable_if<std::is_blah<U2>::value>::type>
void fun1(U1 arg1, U2 arg2)
{
// ...
}
template <class U1, class U2, typename = typename std::enable_if<std::is_blah<U1>::value>::type, typename = typename std::enable_if<std::is_blah<U2>::value>::type>
void fun2(U1 arg1, U2 arg2)
{
// ...
}
template <class U1, class U2, typename = typename std::enable_if<std::is_blah<U1>::value>::type, typename = typename std::enable_if<std::is_blah<U2>::value>::type>
void fun3(U1 arg1, U2 arg2)
{
// ...
}
// ...
};
没错。在上述情况下,我不得不一遍又一遍地编写相同的模板。不用说这很丑陋,使代码难以阅读,也很繁琐麻烦,需要大量的复制黏贴等等...
显然必须有一个合理的解决方案。
其中之一是使用 #define 定义此模板。我认为这不是什么问题,因为当我完成所有声明和定义时,我可以 #undef 它。但也许这是错误的;我只是一个新手,我看到人们谴责任何 #define。
还有其他解决方案吗?或者这个宏解决方案是最好的选择?
typedef
而不是#define
。 - πάντα ῥεῖtypedef template<...> my_template
然后写my_template class C {}
或者my_template void f() {}
。 - user4385532typedef
只有在指定类型时才有用,而 (命名不佳的)templateParameters
在代码中被用作占位符。我认为问题是关于如何避免重复模板参数列表的;即template <typename T1, typename T2, typename T3=blah>
中的部分。这些不是类型,它们是模板参数,因此typedef
无法帮助。 - Andrewtemplate <class T1, class T2, typename = typename std::enable_if<is_blah<T1>::value>::type, typename = typename std::enable_if<is_blah<T2>::value>::type>
来替换template <someLongAndComplicatedTemplate>
。 - user4385532