未打包参数的类型

Type of unpacked argument

本文关键字:类型 参数 包参数      更新时间:2023-10-16

我有以下代码:

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来解包并将每个实参压入vector(我使用Lambda是为了避免递归空模板函数;我更喜欢嵌套的lambda)。然而,它需要使用std::to_string(..),因为vector只接受字符串。因此,当我这样做时:

Print("%", "One", "Two", 5);

不能编译,因为"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
    };
};

但是意识到我不能在实参上使用它,因为它不是模板形参?

我想做:

std::function<void(Args... A)> Unpack = [&] (Args... A)
    {
        auto l = {(ArgumentList.push_back(is_literal<A>() ? A, std::to_string(A)), 0)...};
    };

测试它是否为字面量,但它不正确。如何修复它并测试每个参数是否为字面量?

您可以定义自己的to_string版本:

std::string to_string(const char* s) {
    return s;
}

然后将lambda主体改为:

using namespace std;
auto l = {(ArgumentList.push_back(to_string(A)), 0)...};
编辑:实际上,最好在std中定义to_string:
namespace std {
    std::string to_string(const char* s) {
        return s;
    }
}