【发布时间】:2022-01-10 17:04:11
【问题描述】:
这让我发疯了。我只想将字符串对的可变参数列表发送到替换字符串中单词的模板函数中,并且该函数可以工作,但只有一个参数,而不是可变参数。
这很好用
using std::string;
using spair = std::pair<string, string>;
string replace_all(string& str, const spair& sp)
{
string::size_type pos = 0;
string::size_type rmsize = std::get<0>(sp).size();
while((pos = str.find(std::get<0>(sp), pos)) != string::npos)
{
str.replace(pos, rmsize, std::get<1>(sp));
pos++;
}
return str;
}
string pattern = "My name is {{first_name}} {{last_name}} and I live in {{location}}";
string t = replace_all( pattern, {"{{first_name}}","Homer"} );
/*************************/
但这行不通
template<typename T=spair, typename ...Args>
string replace_all(string& s, const T& arg1, Args const&... args )
{
s = replace_all(s, arg1);
s = replace_all(s, args...);
return s;
}
string v = replace_all( pattern,
{"{{first_name}}","Homer"},
{"{{last_name}}","Simpson"},
{"{{location}}","Springfield"}
);
variadic.cpp:72:8: error: no matching function for call to **'replace_all(std::string&,
【问题讨论】:
-
您遇到了可变参数的根本弱点。带括号的初始化列表是无类型的,它们不能绑定到需要绑定离散类型的模板参数。这是模板如何工作的基本方面,这里没有干净的解决方案。您要么必须显式键入每个参数,而不是提供原始的大括号初始化列表,要么更改整个方法。
标签: c++ templates parameters variadic