C++ 用于模板定义的宏

C++ 用于模板定义的宏,c++,templates,macros,alias,C++,Templates,Macros,Alias,我有一个别名模板问题,因为我有一个代码必须与VS 2012兼容,它不支持别名模板 假设我有一个别名模板,如: template<typename A, typename B> using foo = bar<A,B>; 使用foo=bar的模板; 这样做会很方便,比如: #ifdef NO_ALIAS_TEMPLATE_AVAILABLE #define foo<x,y> bar<x,y> #else template<t

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

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

template<typename A, typename B> using foo = bar<A,B>;
使用foo=bar的模板;
这样做会很方便,比如:

#ifdef NO_ALIAS_TEMPLATE_AVAILABLE
    #define foo<x,y> bar<x,y>
#else
    template<typename A, typename B> using foo = bar<A,B>;
#endif
\ifdef没有可用的别名模板
#定义foo-bar
#否则
使用foo=bar的模板;
#恩迪夫
然而,我能做的就是

    #define foo(x,y) bar<x,y>
#定义foo(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
模板
结构foo{
类型定义栏


这会降低它的使用效果,但这是不可避免的。

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

#ifdef NO_ALIAS_TEMPLATE_AVAILABLE
    #define foo bar
#else
    template<typename A, typename B> using foo = bar<A,B>;
#endif
\ifdef没有可用的别名模板
#定义foo-bar
#否则
使用foo=bar的模板;
#恩迪夫
给定

模板结构条{};
下面几行很好用

foo<int, double> f; // Ok.
bar<int, double> b; // Ok.
foof;//好的。
bar b;//好的。

对于
foo
的普通名称来说,这是一个糟糕的想法,但如果您小心使用宏名称,实际上也没那么糟糕:
#定义MY_LIBRARY_foo::Full::qualified::bar
使用MY_LIBRARY_foo=bar的模板
foo<int, double> f; // Ok.
bar<int, double> b; // Ok.