【发布时间】:2021-08-04 17:22:12
【问题描述】:
我编写了一个有条件地初始化对象的 C++11 函数。考虑以下示例:
arma::mat some_function(bool a, bool b, unsigned long int c) {
if(a) {
if(b) {
arma::sp_mat d(c, c);
} else {
arma::SpMat<short> d(c, c);
}
} else {
if(b) {
arma::mat d(c, c, fill::zeros);
} else {
arma::Mat<short> d(c, c, fill::zeros);
}
}
// Some other computations and a return statement
}
如您所见,我想初始化一个对象d,其中(犰狳)数据类型取决于布尔值a 和b。不幸的是,它无法编译,编译器抱怨 d 没有在随后使用的范围内声明。
我发现了关于类似问题的各种讨论。条件初始化显然是在 C++17 中引入的。但是,我需要在这个应用程序中使用 C++11。其他建议提到 type_traits 库和 lambda 函数。许多讨论集中在有条件地指定对象的内容而不是其数据类型。由于我对 C++ 还很陌生,我不确定如何将这些选项中的任何一个应用到这个嵌套的条件结构中。
【问题讨论】:
-
您初始化的那些名为
d的变量都在一行代码的范围内。但是您的大问题是这些变量具有不同的类型,您希望d的类型是什么? -
一个类型只能依赖于编译时常量,比如模板参数。不能依赖函数参数。
-
std::variant从 C++17 派生自boost::variant。那会奏效的。
标签: c++ c++11 types initialization armadillo