6

そうすることは可能ですか

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

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

abcに電話するたびに書かないように

4

2 に答える 2

12

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は予約済み)

于 2012-05-10T09:51:37.407 に答える
2

はい。ただし、丸括弧を使用する必要があります。

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

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

編集: この種の略語にはマクロを使用しないことをお勧めします。awoodlands ソリューションまたはデフォルトのテンプレート パラメータを使用してください。また、予約名は使用しないでください。

于 2012-05-10T10:37:08.870 に答える