【问题标题】:c++: vector of user-defined type?c++:用户定义类型的向量?
【发布时间】:2019-05-25 05:52:18
【问题描述】:

我有一个要存储数​​据的向量。我希望用户能够决定存储向量的精度级别(浮点数或双精度数)。

如何根据用户输入声明向量?这显然行不通:

std::vector<userWantsFloats ? float : double> data; ...

【问题讨论】:

  • 一旦有了这样一个类,你打算怎么往里面放数据呢?您希望该代码是什么样的?
  • 听起来你想将类型作为模板参数传递。
  • 您为什么希望用户做出这个决定?有什么理由不一直使用double 吗?
  • @SidS 我存储了数十亿个浮点数/双精度数,并希望用户能够选择牺牲内存精度的能力。
  • @SidS 你还想让我详细说明什么?

标签: c++ class templates dynamic


【解决方案1】:

您不能根据仅在运行时知道的值来选择类模板实例化中使用的类型。

使用

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);
}

【讨论】:

    【解决方案2】:

    选项可以是使用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 关于该主题。

    【讨论】:

    • 不幸的是,boost 和 c++17 都不能用于这个项目。谢谢你的解释,我会保存它以防 c++17 最终成为一个选项。
    • std::any 可能更好
    • @Michael - 怎么样?使用std::any 意味着您需要自己在任何地方管理类型切换并复制逻辑。这不是它的本意。
    猜你喜欢
    • 1970-01-01
    • 2011-11-22
    • 2019-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多