或任何其他期望一个参数的函数在begin()/end() - 启用类型。
为什么以下是非法的?
printme({'a', 'b', 'c'});
所有这些都是合法的:
printme(std::vector<char>({'a', 'b', 'c'}));
printme(std::string("abc"));
printme(std::array<char, 3> {'a', 'b', 'c'});
我们甚至可以写下:
const auto il = {'a', 'b', 'c'};
printme(il);
or
printme<std::initializer_list<char>>({'a', 'b', 'c'});
您的第一行
printme({'a', 'b', 'c'})
是非法的,因为模板参数无法推断。如果您明确指定模板参数,例如
T
或
printme<vector<char>>({'a', 'b', 'c'})
您的摘要也有效,因为
printme<initializer_list<char>>({'a', 'b', 'c'})
被认为是类型T
,因此可以推导to的模板参数。
这里唯一的“有趣”部分是auto
会选择类型il
,但模板参数不会。这是因为C ++ 11标准的§14.8.2.5/5明确地指出,这是模板参数的未划分的上下文:
函数参数是关联的参数是初始化器列表(8.5.4),但该参数没有std :: inditializer_list或引用可能cv-qualifiend std :: prinitiaseize_list类型。[示例:
std::initializer_list<char>
-结束示例]
withprintme()
,第7.1.6.4/6节具有明确的支持
auto
如果初始化器是一个式init-list(8.5.4),则有
。std::initializer_list<char>
.您还可以超载该函数以明确采用类型pinitializer_list的参数。
template<class T> void g(T); g({1,2,3}); // error: no argument deduced for T
第14.8.2.5/5
第14.8.2.5/。
函数参数,关联的参数是一个 初始化列表,但参数没有
auto
或参考可能与CV合格
std::initializer_list<>
类型。 [示例:
-最终示例]std::initializer_list<U>
template<typename T>
void printme(std::initializer_list<T> t) {
for (auto i : t)
std::cout << i;
}
i发现了一个解决方案,该解决方案在问题中不适合提供的
这是我开始的:
无法编译以例如:
std::initializer_list
template<class T> void g(T); g({1,2,3}); // error: no argument deduced for T
printme<std::initializer_list<int>>( {1,2,3,4} );
基于另一个答案,我们可以添加一个模板专业化:
printme
:
template <typename V, typename C>
bool in(const C& container, const V& element)
{
return std::find(container.begin(), container.end(), element) != container.end();
}
in({1, 2, 3}, 1);