模板定义的宏

Macro for template definitions

本文关键字:定义      更新时间:2023-10-16

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

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

有没有办法让带有分隔符的宏<>用于其参数?还是我的问题没有简单的解决方案?如果没有,如何实现与别名模板的严格等效?

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

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

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

演示

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

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

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