gpt4 book ai didi

c++ - 常量表达式中不能使用未知值的函数参数

转载 作者:行者123 更新时间:2023-12-01 14:47:18 26 4
gpt4 key购买 nike

为什么我收到编译错误“不能在常量表达式中使用未知值的函数参数‘字段’”?
全部标记为 constexpr,我认为在编译时知道值没有任何问题。
有什么办法可以解决这个错误吗?

#include <tuple>
#include <string_view>

namespace {
template<typename Tuple, typename F, std::size_t... Indices>
constexpr void for_each_impl(Tuple &&tuple, F &&f, std::index_sequence<Indices...>) {
(f(std::get<Indices>(std::forward<Tuple>(tuple))), ...);
}

template<typename Tuple, typename F>
constexpr void for_each(Tuple &&tuple, F &&f) {
const auto N = std::tuple_size<std::remove_reference_t<Tuple>>::value;
for_each_impl(std::forward<Tuple>(tuple), std::forward<F>(f), std::make_index_sequence<N>{});
}

template <typename T, typename... Tuple>
constexpr auto has_type(const std::tuple<Tuple...> &tuple) {
return std::disjunction_v<std::is_same<T, Tuple>...>;
}
}// namespace

template<typename A>
struct meta_field {
constexpr meta_field(std::string_view name, A attributes)
: name(name), attributes(attributes) {
}

const std::string_view name;
const A attributes;
};

int main() {
constexpr auto fields = std::make_tuple(meta_field("a121213", std::make_tuple(int(5))), meta_field("hello", std::make_tuple()));

for_each(fields, [](const auto &field) {
// why unknown value?
if constexpr (has_type<int>(field.attributes)) {

}
});
}
Godbold link

最佳答案

函数参数不是 constexpr,因此您必须改用类型:

template <typename T, typename Tuple> struct has_type : std::false_type {};
template <typename T, typename... Ts> struct has_type<T, std::tuple<Ts...>> : std::disjunction<std::is_same<T, Ts>...> {};
用法类似于
for_each(fields, [](const auto &field) {
if constexpr (has_type<int, std::decay_t<decltype(field.attributes)>>::value) {
std::cout << std::get<int>(field.attributes) << std::endl;
}
});
Demo

关于c++ - 常量表达式中不能使用未知值的函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62996553/

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