gpt4 book ai didi

c++ - 捕获数组模板参数的大小

转载 作者:搜寻专家 更新时间:2023-10-31 02:02:15 25 4
gpt4 key购买 nike

在使用数组非模板类型参数的时候,好像size信息不单独传递的话基本上是无法恢复的。例如,在模板中

template<const char CStr[]>
struct ToTemp {
...
}

任何对 sizeof(CStr) 的引用都将返回 8(或 4,取决于您的系统),因为它实际上是一个 const char *。你可以声明

template<const char CStr[5]>
struct ToTemp {
...
}

template<int N, const char CStr[N]>
struct ToTemp {
...
}

但是第一个需要在编写类时知道实际大小(不是很有用),第二个需要单独传递大小(在这里没有用——可能对强制大小限制有用) .理想情况下我会有类似的东西

template<const char CStr[int N]> //Let the compiler infer N based on the type
struct ToTemp {
...
}

template<int N = -1, const char CStr[N]> //Declare N but let it be forced to a given value, so that I don't have to pass it in 
struct ToTemp {
...
}

...当然,这些都不起作用。最后,我希望能够写

const char foo[] = "abcd";
ToTemp<foo> bar;

并让 bar 正确理解 sizeof(foo) 为 5,而无需传入单独的 sizeof(foo) 模板参数.

最佳答案

您可以使用全局字符串文字作为模板参数来匹配const char[]并通过constexpr函数计算长度:

constexpr size_t GetSize(const char str[])
{
for (size_t i = 0; ; ++i)
{
if (str[i] == '\0')
{
return i;
}
}
}

template <const char str[]>
struct X
{
constexpr static auto Size = GetSize(str);
};

constexpr const char string[] = "42";

void foo()
{
X<string> x;
static_assert(X<string>::Size == 2, "");
}

关于c++ - 捕获数组模板参数的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57588506/

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