我试图在构造函数中使用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;
}
提前致谢。
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] 删除。
我来说两句