4

この質問がすでに回答されているかどうかはわかりません。しかし、ここに行きます:

次のようなことができるかどうか疑問に思っていました

template<typename...classes>
void createObject(){

  //pass each type into my template function wich takes one type only.

}

私はそれが正確にどのように機能するのか本当にわかりません。関数の引数を指定できない理由は、メソッド内で呼び出す必要があるテンプレート関数が 1 つの型しかとらないためです。これは、型に応じてオブジェクトを返すためです。

なにか提案を?

注: GCC 4.6.2

4

2 に答える 2

4
template<typename...>
struct caller;

template<typename T, typename...Rest>
struct caller<T, Rest...>
{
     static void call()
     {
        create<T>();
        caller<Rest...>::call();
     }
};

template<>
struct caller<>
{
     static void call()
     {
     }
};

//since you've not mentioned the return type, I'm assuming it to be void
//if it is not void, then I don't know what you're going to return, and HOW!   
template<typename...classes>
void createObject(){
      caller<classes...>::call();
}

デモ: http://ideone.com/UHY8n


代替 (短いバージョン):

template<typename...>
struct typelist{};

template<typename T, typename ... Rest>
void call(typelist<T,Rest...>)
{
  create<T>();
  call(typelist<Rest...>());
};

void call(typelist<>) { }

template<typename...classes>
void createObject(){
      call(typelist<classes...>());
}

デモ: http://ideone.com/cuhBh

于 2012-06-25T06:22:44.587 に答える
3

1 つの方法は、次の関数を使用して呼び出しを展開することです。

template <typename... Ts>
void swallow(Ts&&...) {
}

次の関数を呼び出したいとします。

template <typename T>
void create() {
}

この場合、voidcreateを何かを返すものに変換するヘルパー関数が必要です。これにより、 swallow(create関数が既に非 void である場合は、この余分な手順は必要ありません)の arg-list で展開できます。 ):

template <typename T>
int createHelper() {
    create<T>();
    return 0;
}

template<typename... Ts>
void createObject(){
    swallow(createHelper<Ts>()...);
}

編集: createHelper の代わりに、コンマ演算子を使ったトリックを使用できます。

swallow((create(), 0)...);
于 2012-06-25T08:15:37.863 に答える