如何避免一遍又一遍地编写相同的模板

How to avoid writing same templates over and over?

本文关键字:一遍 何避免      更新时间:2023-10-16

考虑以下示例,其中我们有两个相互依赖的模板化类:

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一旦我完成了所有的声明和定义。但也许这是错误的;我只是一个新手,我见过有人谴责任何#定义。

还有其他解决方案吗?或者这个宏观解决方案是最好的解决方案?

我能想到的唯一解决方案是定义一些自定义的类型函数别名来实现两个目标:

  • 使你的代码更简洁和(也许)可读;
  • 使维护更容易(即,正如你在评论中指出的,如果你必须做一个改变,你只需要在一个地方做)

例如,您可以更改

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