gpt4 book ai didi

c++ - 解压缩参数的类型

转载 作者:行者123 更新时间:2023-11-28 03:15:02 27 4
gpt4 key购买 nike

我有以下代码:

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

关于c++ - 解压缩参数的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17176860/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com