【发布时间】:2022-01-06 08:03:28
【问题描述】:
我想达到这样的目标:
export_vars("path/to/file.dat", {"variable_name", obj}, {"another_variable", 2});
其中obj 可以是任何类型,只要它具有<< 重载 - 想法是稍后写入ofstream。我已经尝试过(对于一对initializer_list):
void
export_vars(const std::string& path, std::initializer_list<std::pair<std::string, std::any>> args)
{
for (auto& [name, var] : args)
std::cout << name << ": " << var << std::endl;
}
但 std::any 在不知道底层类型的情况下不能是 <<。可以使用可变参数模板和参数包扩展来实现吗?我也尝试过类似的东西:
template <class... Args>
void
export_vars(const std::string& path, Args... args)
{
(std::cout << ... << args.first << args.second) << std::endl;
}
但这显然是错误的。有什么建议吗?
【问题讨论】:
-
你的问题是
{stuff, other_stuff}没有类型。你不能对没有类型的东西进行类型推断。 -
是的,我一开始遇到了这个错误。使用pairs根本不可行吗?
-
应该是:
((std::cout <<args.first << ": " << args.second << std::endl), ...);Demo -
天啊!不幸的是,我仍然得到@NathanOliver 提到的
Candidate template ignored: substitution failure: deduced incomplete pack <(no value)> for template parameter 'Args'。 -
但是,这行得通:
export_vars("path", std::pair{ "hello", 1 }, std::pair{ "hello", "world" });.. 有没有办法帮助编译器推断这是它与可变参数模板的一对?
标签: c++ templates cout variadic parameter-pack