2013年3月25日月曜日

[c++] initializer_list: 初期化リストを () で括ったらエラー

c++11 では vector などの初期化が簡単に書けるようになりました。

こちらの機能を利用して iutest のコードを書いていたのですが、
これダメなのか~と思うことがあったのでブログに残しておきます。

こちらがそのコード。
#include <vector>
 
template<typename T>
void f(::std::initializer_list<T>)
{
}
 
int main(int, char**)
{
    f({1,2,3}); // OK
    //f(({1,2,3})); // NG
    ::std::vector<int> a = {1,2,3}; // OK
    //::std::vector<int> b = ({1,2,3}); // NG
    return 0;
}

() でくくったらダメなんですね。

やりたかったこととしては、マクロ引数に初期化リストを渡したかっただけなので、
可変長引数を使うようにしました。

template<typename T>
void f(::std::initializer_list<T>) {}
void f(int) {}

#define HOGE(x) f(x)

void g()
{
    HOGE(0);
    HOGE(({1, 2, 3}));
}



template<typename T>
void f(::std::initializer_list<T>) {}
void f(int) {}

#define HOGE(...) f(__VA_ARGS__)

void g()
{
    HOGE(0);
    HOGE({1, 2, 3});
}


0 件のコメント:

コメントを投稿