例如,考虑以下示例,其中我们有两个相互依赖的模板类:
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。但也许这是错的;我只是一个新手,我看到人们谴责任何#defines。
还有其他解决方案吗?或者这个宏观解决方案是最好的解决方案吗?
答案 0 :(得分:3)
我能看到的唯一解决方案是定义一些实现两个目标的自定义类型函数和别名:
例如,您可以更改
template<typename T1, typename T2, typename = typename std::enable_if<std::is_pod<T1>::value>::type, typename = typename std::enable_if<std::is_pod<T2>::value>::type>
struct C1{};
在
template<typename T>
using Eif_pod = typename std::enable_if<std::is_pod<T>::value>::type;
template<class T1, class T2, class = Eif_pod<T1>, class = Eif_pod<T2>>
struct C2{};