C ++宏中的模板?

时间:2012-05-10 09:48:57

标签: c++ templates macros

是否可以这样做

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

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

每次拨打abc时都不要写它

2 个答案:

答案 0 :(得分:10)

在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 :(得分:2)

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

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

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

编辑:我建议根本不使用宏来表示这种缩写。使用awoodlands解决方案或可能是默认模板参数。你不得使用保留的名字。