首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多类型std::initializer_list

多类型std::initializer_list
EN

Stack Overflow用户
提问于 2014-01-13 22:24:58
回答 2查看 7.7K关注 0票数 8

我和std::initializer_list有问题。我把它简化为一个简单的例子:

代码语言:javascript
复制
#include <initializer_list>
#include <cstdio>


class Test {
    public:
        template <typename type> Test(const std::initializer_list<type>& args) {}
};

int main(int argc, char* argv[]) {
    Test({1,2});

    getchar();
    return 0;
}

当使用g++ test_initializer.cpp -std=c++0x编译时,它编译和运行良好。但是,如果将第11行更改为Test({1,2.0});,则可以获得:

代码语言:javascript
复制
ian@<host>:~/Desktop$ g++ test_initializer.cpp -std=c++0x
test_initializer.cpp: In function ‘int main(int, char**)’:
test_initializer.cpp:11:14: error: no matching function for call to ‘Test::Test(<brace-enclosed initializer list>)’
test_initializer.cpp:11:14: note: candidates are:
test_initializer.cpp:7:28: note: template<class type> Test::Test(const std::initializer_list<_Tp>&)
test_initializer.cpp:5:7: note: constexpr Test::Test(const Test&)
test_initializer.cpp:5:7: note:   no known conversion for argument 1 from ‘<brace-enclosed initializer list>’ to ‘const Test&’
test_initializer.cpp:5:7: note: constexpr Test::Test(Test&&)
test_initializer.cpp:5:7: note:   no known conversion for argument 1 from ‘<brace-enclosed initializer list>’ to ‘Test&&’

我怀疑这是因为编译器无法确定生成初始化程序列表的类型。是否有一种方法可以修复这个示例,以便它可以处理不同的类型(并且仍然使用初始化程序列表)?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-13 22:38:13

std::initializer_list只需要一种类型。如果需要不同的类型,可以使用各种模板:

代码语言:javascript
复制
template<typename... Args>
Test(Args&&... args);

/* ... */

int main()
{
    Test(1, 2.0);
}
票数 12
EN

Stack Overflow用户

发布于 2017-02-05 20:29:44

让initializer_list保存最任意的指针( void* ),然后在那里进行自己的转换。下面是一个例子。

代码语言:javascript
复制
#include <initializer_list>
#include <iostream>

using std::initializer_list;
using std::cout;
using std::endl;

class Person {
    private:
        string _name;
        int _age;
    public:
        Person(initializer_list<void*> init_list) {
            auto it = init_list.begin();
            _name = *((string*)(*it));
            it++;
            _age = *((int*)(*it));
        }
        void print() {
            cout << "name: " << _name << ". age: " << _age << endl;
        }
};

int main(void) {
    string name{"Vanderbutenburg};
    int age{23};
    Person p{&name,&age};
    p.print(); // "name: Vanderbutenburg. age: 23"

    return 0;
}
票数 -5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21102616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档