【发布时间】:2016-12-11 12:58:52
【问题描述】:
目前我正在研究一个类似于 C# 中的 String.Format(...) 函数的函数,只是在 C++ 中。 (String.Format(...))
但这不是我的问题。该函数工作正常,但问题在于它需要一个vector<string> 作为参数,如果我想使用一个整数作为参数,我必须编写如下代码:
// function prototype, the function body is not relevant here
string format(string str, vector<string> variables);
// ... some context
// i could use to_string() here,
// but imagine a complex type which only overrides the stream operator
int a = 20;
stringstream ss;
ss << a;
string a_str = format("a has the value '{}'", { ss.str() });
那是相当多的样板代码!
因此,我需要一个函数,将 unknown 数据类型的集合转换为 vector<string>。
我尝试了一些这样的事情:
vector<string> vec_string(vector<void*> args) {
vector <string> result;
for (unsigned i = 0; i < args.size(); i++)
{
stringstream ss;
// I can't dereference an object without knowing to pointer type. :(
ss << *((int*)args[i]);
result.push_back(ss.str());
}
return result;
}
// ... some context
int a = 10;
cout << format("some int: '{}'", vec_string({ (void*) &a }));
这显然只适用于整数并且非常不舒服。我觉得这样做的唯一方法是可变参数宏,但我不知道它们是如何工作的。
here 是我的format(...) 方法的链接。
很抱歉我的拼写错误,但我已尽力改正它。
【问题讨论】:
-
查看
std::tuple、std::initializer_list和std::forward可以做什么。 -
可变参数宏在这里 IMO 是个坏主意,请查看可变参数模板以了解 C++ 类型系统中的类似功能。
-
我现在正在阅读this,整个事情似乎比我想象的要复杂得多。
标签: c++ macros string-formatting variadic