C++ 未打包参数的类型
我有以下代码:C++ 未打包参数的类型,c++,c++11,lambda,variadic-templates,C++,C++11,Lambda,Variadic Templates,我有以下代码: 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_ba
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";
}
它不会编译,因为“One”和“Two”已经是文本,而std::to_string
只接受整数类型
我怎样才能知道传递的是什么类型的“参数”?我试过:
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
};
};
模板
struct是_-literal
{
枚举{value=false};
};
模板
struct是_-literal
{
枚举{value=true};
};
模板
struct是_-literal
{
枚举{value=true};
};
模板
struct是_-literal
{
枚举{value=true};
};
模板
struct是_-literal
{
枚举
{
值=真
};
};
但是意识到我不能在参数上使用它,因为它不是模板参数
我想做:
std::function<void(Args... A)> Unpack = [&] (Args... A)
{
auto l = {(ArgumentList.push_back(is_literal<A>() ? A, std::to_string(A)), 0)...};
};
std::function Unpack=[&](Args…A)
{
自动l={(ArgumentList.push_-back(is_-literal()?A,std::to_-string(A)),0)…};
};
测试它是否是文字,但它不正确。如何修复并测试每个参数是否为文本?您可以定义自己的to_string
版本:
std::string to_string(const char* s) {
return s;
}
然后将lambda body更改为:
using namespace std;
auto l = {(ArgumentList.push_back(to_string(A)), 0)...};
编辑:实际上,最好只在std
中定义to_字符串
:
namespace std {
std::string to_string(const char* s) {
return s;
}
}
为什么特别需要检测文本?你想要的是检测一个类型是否可以在input to或not中给定。我想通过检测它是否是文本,我可以选择不将它传递给_string()。这不是一回事吗?这两种方式我都被卡住了。或者干脆使用std::to_string
@0x499602D2不,我认为它不会起作用。这可以启用ADL,但它没有那么有用,因为我们在这里使用const char*
操作。实际上,只需将自己的添加到std
名称空间中,可能会更好@CantChooseServerNames:)谢谢@catscradel;我将字符串添加到名称空间std中,效果非常好!我将其模板化为使用is_literal和类型T,这样它就不仅仅是const char*,而是所有其他类型的“strings”:
namespace std {
std::string to_string(const char* s) {
return s;
}
}