在constexpr环境中是否可以以通用方式为任何类型获取值,即使该类型不是默认可构造的?如果不是,请为什么?
例如,我想在constexpr函数的std::variant
中获得类型的索引。
原谅我对std::is_default_constructible
的误用(我将其用作通用的默认可构造类型持有者),但该名称仍然适合:D
#include <utility>
#include <type_traits>
#include <variant>
//how i made it work without default constructible types..
template <typename T, typename Variant>
constexpr auto index_ugly() {
return [&]<size_t... I>(std::index_sequence<I...>) {
return std::variant<std::is_default_constructible<
std::variant_alternative_t<I, Variant>>...>{
std::is_default_constructible<T>{}}
.index();
}(std::make_index_sequence<std::variant_size_v<Variant>>{});
}
//how it could look like if i could generate a value
//for the type T regardless of its default constructibility
template<typename T, typename Variant>
constexpr auto index() {
return Variant{T{}}.index();
}
struct X {
X (int) {}
};
constexpr int a = index<X, std::variant<int, double, X>>();