【问题标题】:Macro for template definitions模板定义的宏
【发布时间】:2018-08-08 17:41:11
【问题描述】:

我的别名模板有问题,因为我的代码必须与 VS 2012 兼容,它不支持别名模板。

假设我有一个别名模板,例如:

template<typename A, typename B> using foo = bar<A,B>;

那么能够做这样的事情会很方便:

#ifdef NO_ALIAS_TEMPLATE_AVAILABLE
    #define foo<x,y> bar<x,y>
#else
    template<typename A, typename B> using foo = bar<A,B>;
#endif

我能做的最好的就是

    #define foo(x,y) bar<x,y>

为了代码的可读性,我不想用圆括号替换我所有代码中的所有模板特化。

有没有办法让一个带有分隔符&lt;&gt; 的宏作为它的参数?或者我的问题没有简单的解决方案?如果不是,如何实现与别名模板的严格等价?

【问题讨论】:

    标签: c++ templates macros alias


    【解决方案1】:

    不,预处理器不能使用&lt;&gt; 来分隔宏参数。

    您可以使用类模板模拟别名模板:

    template <typename A, typename B>
    struct foo {
        typedef bar<A, B> type;
    };
    
    // Usage: foo<A, B>::type
    // Generic context: typename foo<A, B>::type
    

    Demo

    这会使它的使用变得不那么好,但这是不可避免的。

    【讨论】:

      【解决方案2】:

      以下更简单的解决方案适合我。

      #ifdef NO_ALIAS_TEMPLATE_AVAILABLE
          #define foo bar
      #else
          template<typename A, typename B> using foo = bar<A,B>;
      #endif
      

      给定

      template <typename A, typename B> struct bar {};
      

      以下几行工作正常。

      foo<int, double> f; // Ok.
      bar<int, double> b; // Ok.
      

      【讨论】:

      • 这对于foo 的常用名称来说是一个糟糕的想法,但如果你小心你的宏名称,它实际上并没有那么糟糕:#define MY_LIBRARY_FOO ::fully::qualified::bartemplate &lt;typename A, typename B&gt; using MY_LIBRARY_FOO = bar&lt;A, B&gt;
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-16
      • 1970-01-01
      • 2012-03-23
      相关资源
      最近更新 更多