gpt4 book ai didi

c++ - 如何在编译时进行条件变量初始化?

转载 作者:可可西里 更新时间:2023-11-01 17:44:44 26 4
gpt4 key购买 nike

C++11 标准有 std::conditional<>在编译时通过一些 bool 条件进行类型选择的模板。如何做相同的操作,但选择变量初始化的初始值?类似于 type a = (exp) ? first_value : second_value; .

我使用我的模板:

template<bool B, typename T>
inline constexpr T&& conditional_initialize(T&& i1, T&& i2) {
return B ? std::move(i1) : std::move(i2);
}

但它只能用于 POD 类型:int a = conditional_initialize<true>(1, 2); .对于数组初始化,此模板编译时出现错误。错误编译示例:int a[] = conditional_initialize<true>({1, 2}, {3,4,5});

Error message: no matching function for call to 'conditional_initialize(<brace-enclosed initializer list>, <brace-enclosed initializer list>)';

谁能帮我做模板?

最佳答案

template<class T, std::size_t N, std::size_t M, bool b>
std::array<T, b?N:M>
conditional_array( std::array<T, N>&& lhs, std::array<T, M>&& rhs ) {
return std::move(std::get<b?0:1>( std::tie(lhs, rhs) ) );
}

这给你:

auto a = conditional_array<int,2,3,true>({{1, 2}}, {{3,4,5}});

这很接近。

一般来说,{} 构造不是表达式,它们不能通过任何机制通过另一个变量完美转发。

我们还可以得到:

auto a = cond_init<true>( make_array(1,2), make_array(3,4,5) );

还有一点工作。

template<bool Test, class A, class B>
std::conditional_t<Test,A,B>
cond_init(A a, B b) {
return std::move( std::get<Test?0:1>( std::tie(a,b) ) );
}
template<class T0, class...Ts>
std::array< std::decay_t<T0>, sizeof...(Ts)+1 >
make_array( T0&& t0, Ts&&...ts ) {
return {{std::forward<T0>(t0), std::forward<Ts>(ts)...}};
}

我没有制作这些constexpr,因为懒。

关于c++ - 如何在编译时进行条件变量初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38832210/

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