【问题标题】:Template in a Macros in C++?C ++中宏中的模板?
【发布时间】:2012-05-18 21:04:03
【问题描述】:

有可能吗

# define abc<T1> __abc<T1, T2>

template<typename T2> void somefun() {
    ... 
    abc<int>(...);
    abc<double>(...);
    ...
}

只是为了不每次我调用 abc 时都写它

【问题讨论】:

    标签: c++ templates macros


    【解决方案1】:

    在 C++11 中你可以这样做:

    template<typename T2> void somefun() {
        template <typename T>
        using abc = __abc<T, T2>;
    }
    

    如果不这样做,您可以使用宏,但您需要这样做:

    #define abc(T1) __abc<T1, T2>
    
    //usage:
    
    abc(Type) instance;
    

    但由于这看起来不太自然,我个人会避免使用它。

    如果你想避免 C++11 之前的宏,你可以这样做:

    template <typename T2>
    struct type {
      template <typename T1>
      struct lookup {
        typedef __abc<T1,T2> type;
      };
    };
    
    template <typename T2> void somefun() {
      typedef type<T2> abc;
      typename abc::template lookup<int>::type();
    }
    

    但老实说,它的可读性甚至不如宏案例

    (注:__abc 保留)

    【讨论】:

    • 我不会使用宏,请完整输入。它看起来不自然,当它变老时会混淆他人和你自己。此外,它存在于头文件中,可能会导致头文件之外的代码出现问题。
    【解决方案2】:

    可以,但您需要使用圆括号。

    # define abc(T1) __abc<T1, T2>
    
    template<typename T2> void somefun() {
        ... 
        abc(int)(...);
        abc(double)(...);
    }
    

    编辑:我的建议是根本不使用宏来表示这种缩写。使用 awoodlands 解决方案或默认模板参数。并且您不得使用保留名称。

    【讨论】:

    • 很有趣,它可以工作,但是使代码变得棘手且难以理解,因为它看起来像 C 风格的转换:)
    • 你要了,你得到了 ;-)
    • @user1386738:“它有效,但使代码变得棘手且难以理解”适用于大多数(如果不是全部)宏。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-07
    • 2015-10-16
    • 1970-01-01
    • 2010-12-04
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多