C++ std::应用和常量表达式?
我在中尝试了以下代码:C++ std::应用和常量表达式?,c++,c++17,stdapply,C++,C++17,Stdapply,我在中尝试了以下代码: #包括 #包括 #包括 #包括 #包括 #包括 int main() { constexpr std::array str{“123456789”}; constexpr auto foo=std::apply([](auto…args)constexpr{std::integer_sequence{};},str); std::cout函数参数不能标记为constexpr。因此,您不能在需要常量表达式的位置使用它们,如非类型模板参数 要执行您尝试执行的这类操作,需要基于
#包括
#包括
#包括
#包括
#包括
#包括
int main()
{
constexpr std::array str{“123456789”};
constexpr auto foo=std::apply([](auto…args)constexpr{std::integer_sequence{};},str);
std::cout函数参数不能标记为constexpr
。因此,您不能在需要常量表达式的位置使用它们,如非类型模板参数
要执行您尝试执行的这类操作,需要基于模板参数的某种编译时字符串处理。所有constexpr函数必须在constexpr和not之间都有效,即使标记为constexpr
有一个建议是使用constexpr literal作为非类型模板参数传递字符。然后,“hello”\u bob
可以直接扩展到参数包
另一种方法是,您可以通过某种机制将std::integral_constant
传递给lambda,比如我的索引器
。然后转换为T
是constepr,即使变量不是。这对的“您好”没有帮助
到一个序列。您想做的事情不需要std::apply
:
#include <array>
#include <iostream>
#include <tuple>
#include <typeinfo>
#include <functional>
#include <utility>
#include <type_traits>
template <std::size_t N, class = std::make_index_sequence<N>>
struct iterate;
template <std::size_t N, std::size_t... Is>
struct iterate<N, std::index_sequence<Is...>> {
template <class Lambda>
constexpr auto operator()(Lambda lambda) {
return lambda(std::integral_constant<std::size_t, Is>{}...);
}
};
int main()
{
constexpr std::array<const char, 10> str{"123456789"};
constexpr auto foo = iterate<str.size()>{}([](auto... is) constexpr { return std::integer_sequence<char, str[is]...>{}; });
std::cout << typeid(foo).name();
}
#include除非这在C++1z中发生了更改,否则您不能有constepr函数参数。也就是说,每个函数都必须假设它可以用运行时参数调用,然后您的lambda就没有意义了。@krzaq真是太遗憾了……我认为这一个实际上还可以。std::integral_constant
的重载是consteprtor T()
允许它在constexpr上下文中使用。或者我有什么误解吗?关于整型常量,你似乎是对的。并且建议你的代码完全正确。你甚至可以制作“工厂”对于它,但当前gcc在此上崩溃。即auto const&
template参数。如果稍微修改为template
,然后一切正常,但我需要手动提供大小
参数。@W.F.我提交了错误,但其状态尚未更改以解决。该扩展非常旧。不知道是否有建议。
#include <array>
#include <iostream>
#include <tuple>
#include <typeinfo>
#include <functional>
#include <utility>
#include <type_traits>
template <std::size_t N, class = std::make_index_sequence<N>>
struct iterate;
template <std::size_t N, std::size_t... Is>
struct iterate<N, std::index_sequence<Is...>> {
template <class Lambda>
constexpr auto operator()(Lambda lambda) {
return lambda(std::integral_constant<std::size_t, Is>{}...);
}
};
int main()
{
constexpr std::array<const char, 10> str{"123456789"};
constexpr auto foo = iterate<str.size()>{}([](auto... is) constexpr { return std::integer_sequence<char, str[is]...>{}; });
std::cout << typeid(foo).name();
}