我对别名模板有问题,因为我有一个代码,该代码必须与不支持别名模板的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>
为了代码的可读性,我不想用圆括号替换我所有代码中的所有模板专业化。
有没有办法使用带有定界符<>
的宏作为其参数?还是没有简单的解决方案来解决我的问题?如果没有,如何对别名模板实施严格的对等?
答案 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
这会使它的用法不太美观,但这是不可避免的。
答案 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.