C++中的宏模板?

6

你能否做到这一点?

# define abc<T1> __abc<T1, T2>

template<typename T2> void somefun() {
    ... 
    abc<int>(...);
    abc<double>(...);
    ...
}

只是为了不在每次调用abc时重复编写它

2个回答

13
在C++11中,您可以进行以下操作:
template<typename T2> void somefun() {
    template <typename T>
    using abc = __abc<T, T2>;
}

如果没有这个,你可以使用宏,但需要执行以下操作:

#define abc(T1) __abc<T1, T2>

//usage:

abc(Type) instance;

但是个人认为这看起来不太自然,我会避免使用。

如果你想避免在C++11之前使用宏,可以尝试以下方式:

template <typename T2>
struct type {
  template <typename T1>
  struct lookup {
    typedef __abc<T1,T2> type;
  };
};

template <typename T2> void somefun() {
  typedef type<T2> abc;
  typename abc::template lookup<int>::type();
}

但是说实话,这比宏情况下的代码还要难懂。
(注:__abc是保留字)

1
我不会使用宏,而是将其完整地打出来。这样看起来更自然,当它变旧时也不会让其他人和你自己感到困惑。此外,它存在于头文件中,可能会对头文件之外的代码造成问题。 - Beached

2

是的,但你需要使用圆括号。

# define abc(T1) __abc<T1, T2>

template<typename T2> void somefun() {
    ... 
    abc(int)(...);
    abc(double)(...);
}

编辑:我的建议是不要使用宏来进行这种缩写。可以使用awoodlands的解决方案或者默认模板参数。而且不应该使用保留名称。


1
有趣且有效,但会使代码变得棘手和难以理解,因为它看起来像是C风格的强制转换 :) - user1386738
你提出了要求,现在你得到了它;-) - Gunther Piez
1
“它有效,但使代码变得棘手且更难理解”适用于大多数(如果不是全部)宏。 - MSalters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接