6

可変個引数テンプレート関数で中括弧で囲まれた初期化子リストを使用しようとしていますが、コンパイラが文句を言います...質問が多すぎますか、それとも何か間違ったことをしましたか?

これは、例によって最もよく示されています。

struct Bracy
{
    Bracy(int i, int j)
    {
    }
};

struct Test
{

    void consumeOne(int i)
    {
    }

    void consumeOne(const Bracy & bracy)
    {
    }

    void consume()
    {
    }

    template<typename T, typename ...Values>
    void consume(const T & first, Values... rest)
    {
        consumeOne(first);
        consume(rest...);
    }

    template<typename ...Values>
    Test(Values... values)
    {
        consume(values...);
    }
};

void testVariadics()
{
    Test(7,{1,2}); //I'd like {1,2} to be passed to consumeOne(const Bracy & bracy)
}

GCC(4.7)によると:

main.cpp:45:14: error: no matching function for call to ‘Test::Test(int, <brace-enclosed initializer list>)’
4

2 に答える 2

2

ブレースで囲まれた初期化子リストは転送できないため、残念ながら運が悪いです。

于 2012-08-12T12:30:54.100 に答える
0

これはあなたが望むものへの大まかな試みです...

#include <iostream>
#include <initializer_list>

struct Bracy {
    Bracy(int x, int y) {}
};

struct Test {
    void consumeOne(std::initializer_list<int>) { std::cout << "initializer list version (Bracy?)\n"; /* Bracy? */}

    void consumeOne(int) { std::cout << "int version\n"; }

    template<typename T>
    void consume(T t) { consumeOne(t); }

    template<typename T, typename ... Args>
    void consume(T first, Args ... args) {
        consumeOne(first);
        consume(args...);
    }

    template<typename ... Args>
    Test(Args ... args) {
        consume(args...);
    }
};

int
main(int argc, char** argv) {
    Test(1, std::initializer_list<int>{1,2}, 2, 3, std::initializer_list<int>{1,2});
    return 0;
}

output: int version
        initializer list version (Bracy?)
        int version
        int version
        initializer list version (Bracy?)
于 2012-08-12T11:54:11.933 に答える