我无法将全局cstyle数组传递给C ++ 14的constexpr函数。 我有一个像这样的数组:
I22
我有两个功能:
static const char t[] = "sometext";
当我这样调用第一个函数时:
template <typename T, typename U, std::size_t N>
constexpr static auto count(T (&arr)[N], const U &val)
{
auto cnt = 0;
auto it(std::cbegin(arr));
while (it != std::cend(arr))
{
if (*it == val)
cnt++;
it++;
}
return cnt;
}
template <typename T, std::size_t N> constexpr static auto count_wrapper(T (&arr)[N])
{
constexpr auto num_elems(count(arr, ','));
return num_elems;
}
我可以编译代码并运行它,但是当我这样调用第二个函数时:
std::cout << count(t, ',') << std::endl;
我得到一个错误:
main.cpp:实例化为constexpr auto t(T(&)[N])[with T = const char;长 unsigned int N = 46]’:main.cpp:51:53:从此处开始 main.cpp:40:35:在constexpr中扩展“ count((*&arr),',')” main.cpp:40:20:错误:“ arr”不是常数 表达 constexpr auto num_elems(count(arr,',')+1);
答案 0 :(得分:0)
参数不是/不能为OnResponse
。 (constexpr
函数可在非constexpr上下文中使用。)
请注意,constexpr
可能是在运行时计算的。您将需要
std::cout << count(t, ',') << std::endl;
具有constexpr auto c = count(t, ',');
std::cout << c << std::endl;
评估保证。
如果合适,您可以将值包装为类型。
constexpr
答案 1 :(得分:0)
什么是num_elems
?如果是花哨的初始化,则可以按以下方式“重写”整个代码:
#include <cstdint>
#include <iterator>
const char t[] = "sometext";
template <typename T, typename U, std::size_t N>
constexpr auto count(const T (&arr)[N], const U &val)
{
std::size_t cnt = 0;
for(auto it = std::begin(arr); it != std::end(arr); ++it)
{
if (*it == val)
cnt++;
}
return cnt;
}
template <typename T, std::size_t N>
constexpr auto count_wrapper(const T (&arr)[N])
{
auto const num_elems = count(arr, 'e');
return num_elems;
}
int main()
{
constexpr auto x = count_wrapper(t);
return static_cast<int>(x);
}
这将编译并正确运行。我将,
更改为e
,因此它计算了一些元素。我也将while
更改为for
循环。我也确实将auto cnt
更改为std::size_t cnt
。
请注意,由于auto
,x
中main
的类型为size_t
。