如何在编译时进行条件变量初始化
How to do the conditional variable initialization at compiler time?
c++ 11标准有std::conditional<>
模板,用于编译时根据布尔条件进行类型选择。如何做同样的操作,但为选择初始化值的变量初始化?与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});
错误消息:没有匹配函数调用'conditional_initialize(<大括号括起来的初始化器list>, <大括号括起来的初始化器list>)';大括号括起来的初始化器list>大括号括起来的初始化器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++条件变量
- 在条件变量中触发错误信号的频率是多少
- 在通知提升间处理条件变量时未按住锁会导致问题
- 通知条件变量后使用互斥锁
- 滥用条件变量
- 升压插值条件变量可以虚假唤醒吗?
- 子线程中的条件变量等待停止主线程中的执行
- 条件变量基本示例
- 正在连接的等待条件变量的线程会发生什么情况?
- C++11如何在1个线程中使用条件变量处理2个线程安全队列
- 当线程处理不同的类时,应该在哪里声明条件变量、互斥对象
- 为什么在同一条件变量上使用多个互斥锁会使此代码崩溃?
- 条件变量:wait_for.gcc错误
- 如何"stop"正在等待条件变量的分离线程?
- 如何杀死被条件变量锁定的线程?
- 使用互斥锁和条件变量作为成员时如何修复"use of deleted function"?
- C++ 多个使用者线程卡在条件变量上
- POSIX 条件变量和互斥体"竞争"
- 将cpp_redis pub/sub与条件变量一起使用时出现问题