Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 未打包参数的类型_C++_C++11_Lambda_Variadic Templates - Fatal编程技术网

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;
    }
}