我有以下代码:
template<typename... Args>
void Print(const char* Text, Args... args)
{
std::vector<std::string> ArgumentList;
std::function<void(Args... A)> Unpack = [&] (Args... A)
{
auto l = {(ArgumentList.push_back(std::to_string(A)), 0)...};
};
Unpack(args...);
for (auto it = ArgumentList.begin(); it != ArgumentList.end(); ++it)
std::cout<<*it<<"\n";
}
它使用Lambda解压缩并将每个参数推送到向量中(我使用lambda来避免递归的空模板函数;我更喜欢嵌套的lambda)。但是,它需要使用std::to_string(..)
,因为向量只接受字符串。因此当我这样做时:
Print("%", "One", "Two", 5);
它不会编译,因为"One"
和"Two"
已经是文字而std::to_string
只采用整数类型。
我怎样才能弄清楚&#34;参数&#34;正在通过?我试过了:
template<typename T>
struct is_literal
{
enum {value = false};
};
template<>
struct is_literal<TCHAR>
{
enum {value = true};
};
template<>
struct is_literal<TCHAR*>
{
enum {value = true};
};
template<>
struct is_literal<const TCHAR*>
{
enum {value = true};
};
template<typename Char, typename Traits, typename Alloc>
struct is_literal<std::basic_string<Char, Traits, Alloc>>
{
enum
{
value = true
};
};
但是我意识到我无法在论证中使用它,因为它不是模板参数?
我想这样做:
std::function<void(Args... A)> Unpack = [&] (Args... A)
{
auto l = {(ArgumentList.push_back(is_literal<A>() ? A, std::to_string(A)), 0)...};
};
哪个测试它是否是字面的,但它不对。如何修复它并测试每个参数是否为文字?
答案 0 :(得分:2)
您可以定义自己的to_string
版本:
std::string to_string(const char* s) {
return s;
}
然后将你的lambda身体改为:
using namespace std;
auto l = {(ArgumentList.push_back(to_string(A)), 0)...};
编辑:实际上,在to_string
内定义std
可能更好:
namespace std {
std::string to_string(const char* s) {
return s;
}
}