模板定义的宏

时间:2018-08-08 17:41:11

标签: c++ templates macros alias

我对别名模板有问题,因为我有一个代码,该代码必须与不支持别名模板的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>

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

有没有办法使用带有定界符<>的宏作为其参数?还是没有简单的解决方案来解决我的问题?如果没有,如何对别名模板实施严格的对等?

2 个答案:

答案 0 :(得分:2)

否,预处理器不能使用<>来分隔宏参数。

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

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

这会使它的用法不太美观,但这是不可避免的。

答案 1 :(得分:1)

以下更简单的解决方案对我有用。

#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.