【发布时间】:2016-08-08 23:09:44
【问题描述】:
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});
谁能帮我做模板?
【问题讨论】:
-
@AndyG 不,是
std::initializer_list<int> -
int a[] = conditional_initialize<true>({1, 2}, {3,4,5});这不起作用,您不能复制或移动构造内置数组。 -
@alexeykuzmin0 确实是这样,但不幸的是templates cannot deduce
std::initializer_list。 -
首先,
int[]是 POD 类型。其次,您不能从initializer_list<int>初始化int a[],这几乎是您希望{1,2}在该调用中推断出的最好的事情。{}构造不是表达式,因此它们不能完美地存储在类型变量或参数中。它们可用于构造类型化存储,但类型化存储与{}不同。这是“完美”转发的失败之一。 -
@23W 因为正如他所说,您无法使用
std::initializer_list初始化内置数组。一方面,内置数组需要在编译时知道它的长度,std::initializer_list会隐藏该信息直到运行时。