我有一个要存储数据的向量。我希望用户能够确定存储向量的精度级别(浮点数或双精度数)。
如何根据用户输入声明向量?这显然行不通:
std::vector<userWantsFloats ? float : double> data; ...
答案 0 :(得分:3)
您不能基于仅在运行时知道的值来选择用于类模板实例化的类型。
使用
std::vector<userWantsFloats ? float : double> data;
如果在编译时知道userWantsFloats
的值,则是确定的。如果仅在运行时不知道userWantsFloats
的值,那就不好。
您将不得不使用以下内容:
if ( userWantsFloats )
{
std::vector<float> data;
// Use data
}
else
{
std::vector<double> data;
// Use data
}
为了能够最大程度地重用其余代码,它们必须是函数模板和/或类模板。
template <typename T>
void myAppLogic(std::vector<T>& data)
{
// Do the work of your application
}
if ( userWantsFloats )
{
std::vector<float> data;
myAppLogic(data);
}
else
{
std::vector<double> data;
myAppLogic(data);
}
答案 1 :(得分:3)
c++17选项可以使用std::variant
。
std::variant<std::vector<float>, std::vector<double>> data;
然后您可以根据用户输入初始化变量,但是只能使用std::visit
std::visit([](auto&& vec) {
// Do your thing
}, data);
如果不是C ++ 17,则boost具有一个启发了现在标准模板的变体模板。您可以改用它。咨询boost documentation。