Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::应用和常量表达式?_C++_C++17_Stdapply - Fatal编程技术网

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