声明一个 c++ 向量,它可以包含命名空间中定义的所有数据类型

declare a c++ vector that can contain all data types defined in a namespace

我有一个名为“dtypes.h”的文件,其中包含一些数字数据类型的定义。

namespace dtypes {
  typedef signed short int int16;      
  // ... some other dtypes
}

我还有另一个文件,我想在其中创建一个可以包含所有这些数据类型(和其他向量)的向量。我想到了这样的事情:

#include <vector>
#include "dtypes.h"

std::vector<std::variant<\* ??? *\>> content; 

我真的不知道该放什么而不是“???”,而不必列出所有不同的数据类型(不做 std::vector<std::variant<dtypes::int16, dtypes::int32 \*...*\>> content;
我找到了一些示例 here,但这并不是我想要的。

您不一定需要在那里列出正确的清单,但您需要在某处列出清单。无法避免显式编写列表。

就像链接问题中的一个答案所建议的那样,您可以使用 std::any 的向量来存储 any 类型的 objects。明显的缺点是失去了变体类型的特征。


关于typedef signed short int int16;,建议看标准<cstdint> header。它包含固定宽度整数的别名。无需重复该工作(除非您需要支持 pre-C++11 并且不能使用开源库)。

您可以使用 std::vector 存储所有项目,方法是将 std::any 作为模板参数提交给 std::variant。它看起来像这样,

std::vector<std::variant<std::any>> arr;
arr.push_back("Hello World");
arr.push_back(10);
arr.push_back(10.0f);
arr.push_back(10.0);

auto any = std::get<std::any>(arr[0]);
auto pTypeName = any.type().name();    // You can get the name of the type to match and cast if your not sure about the index.
std::string str = std::any_cast<const char*>(any);

如果必须使用 std::variant,现在您可以使用它。如果不是,您可以使用 std::anystd::vector 作为其他答案所述。