在没有默认可构造性的情况下在constexpr环境中获取任何类型的值

时间:2019-02-07 16:03:04

标签: c++ constexpr c++20

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

0 个答案:

没有答案