std :: initializer_list作为模板类中的构造函数参数

简兹

我试图在构造函数中使用std :: initializer_list接受可变数量的参数。使用非模板类可以正常工作,但是使用模板类会产生编译错误。有人可以指出我正确的方向吗?我的g ++可以使用C ++ 17。

#include <iostream>
#include <vector>
#include <type_traits>
#include <initializer_list>

struct Nontemplate
{
    // std::initializer_list for a function taking variable number of arguments
    template <class Iterator>
    Nontemplate(std::initializer_list<Iterator> list) {
        std::cout << "size: " << list.size() << std::endl;
        for(auto it : list) {
            std::cout << *it << std::endl;
        }
    }
};

template <class T, class TIterator>
struct Template
{
    std::vector<T> vec;

    Template(std::initializer_list<TIterator> list)
    {
        if(!std::is_same<typename std::iterator_traits<TIterator>::value_type, T>::value)
            throw std::runtime_error("Iterator value type is not the expected.");

        std::cout << "size: " << list.size() << std::endl;

        vec.clear();
        vec.reserve(list.size());
        for(T val : list)
            vec.push_back(val);
    }
};

int main()
{
    double vec[] = {0,1,2,3,4,5};

    Nontemplate cls0({vec, vec+2, vec+3, vec+4}); // no problem
    //Template cls1({vec, vec+2, vec+3, vec+4});  // compiling error
    return 0;
}

提前致谢。

贾罗德42

Template cls1({vec, vec+2, vec+3, vec+4}) 无法推断T。

你可能会用

Template<double, double*> cls1({vec, vec+2, vec+3, vec+4});

或提供自定义扣除指南:

template <typename It>
Template(std::initializer_list<It>)
-> Template<typename std::iterator_traits<It>::value_type, It>;

或者简化您的班级以消除这一点 T

template <class TIterator>
struct Template
{
    using T = typename std::iterator_traits<TIterator>::value_type;
    std::vector<T> vec;

    Template(std::initializer_list<TIterator> list)
    {
        std::cout << "size: " << list.size() << std::endl;

        vec.clear();
        vec.reserve(list.size());
        for(T val : list)
            vec.push_back(val);
    }
};

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

数组vs std :: initializer_list作为函数参数

在std :: initializer_list的构造函数的参数列表中的折叠与“正常”折叠

构造函数中的std :: initializer_list转换

std :: initializer_list构造函数

如何使用带有std :: initializer_list的构造函数设计类?

使用std :: initializer_list构造函数而不会产生歧义?

如何编写正确的std :: initializer_list构造函数

如何检测模板参数是否为 std::initializer_list

作为std :: initializer_list对象的抽象类

C ++将std :: initializer_list强制转换为模板化函数中的容器

使用std :: initializer_list参数的非成员函数(/非构造函数上下文)的重载解析

具有initializer_list和size的std :: unordered_map构造函数在main中进行编译,但在类定义中未进行编译

采用 std::initializer_list 的构造函数优于其他构造函数

如何使用std :: initializer_list <double>构造一个构造函数

无法从std :: initializer_list <int>构造std :: initializer_list <int const>

在clang中返回std :: initializer_list

类支撑初始化被误解为std :: initializer_list而不是副本构造

std :: initializer_list构造函数和“初始化初始化”问题

显式构造函数和std :: initializer_list初始化

如何检查类型'T'是否具有'T(std :: initializer_list <U>)'构造函数

为c样式的字符串创建std :: initializer_list构造函数

C ++构造函数采用大小为一的std :: initializer_list

std::initializer_list 作为重载运算符的右手参数?

是否可以以编程方式构造std :: initializer_list?

从initializer_list错误构造一个std :: map

std :: initializer_list的实现

std :: initializer_list的实现

C ++-std :: initializer_list与std :: span

使用std :: initializer_list作为成员变量