给定两个 constexpr
函数,是否可以将它们组合成一个函数?
template <char... C>
constexpr int boo()
{
char ch[] = { C... };
int count = 0;
for (char c : ch)
{
if (c != '0') count += 1;
}
return count;
}
template <char... C>
constexpr auto foo()
{
std::array<char, boo<C...>()> x{};
return x;
}
如示例所示,我可以将“count
”作为常量返回。
我的问题是我不能在声明的函数中使用“count
”作为常量。也就是说,如果 'boo()
' 的主体放在 'foo()
' 中,编译器将抛出 'count
' 而不是是一个常数。
最佳答案
问题是 std::array
需要一个常量作为大小值。
如果定义 count
并在foo()
里面修改, count
(如 foo()
函数中所示)是一个变量,而不是常量。
所以你需要在另一个地方修改它:在一个constexpr
函数,因此返回值成为编译时已知常量。
如果你可以使用 C++17,那么模板折叠(通过 Evg 和 Rakete1111 的改进;谢谢),你可以避免 bar()
完全
template <char... C>
constexpr auto foo()
{
std::array<char, (0u + ... + (C != '0'))> x{};
return x;
}
但是如果你只有 C++11,你就需要递归
template <typename = void>
constexpr std::size_t bar ()
{ return 0u; }
template <char C0, char ... C>
constexpr std::size_t bar ()
{ return bar<C...>() + (C0 == '0' ? 0u : 1u); }
template <char... C>
constexpr std::array<char, bar<C...>()> foo()
{ return {}; }
关于c++ - 强制表达式为 constexpr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56723272/