c++ - typedef vector

标签 c++ reflection c++14

C++11/14 中是否有可能以任何 方式拥有类型(def) 的 vector ?

我尝试的第一件事是有一个基类的 vector ,并以某种方式从它的派生形式中获取 typedef,但无论我尝试什么我都无法让它工作(最有可能不可能)。

伪 C++:

class base
{
   /* somehow access 'type' from derived */
}

template <typename T>
class derived : base
{
   typedef T type;
}

vector<base*> vec;
vec.push_back( new derived<int> );
vec.push_back( new derived<double> );
vec.push_back( new derived<float> );
vec.push_back( new derived<string> );

for(auto& item : vec)
   static_cast< item->type >( /* something */ );

最佳答案

Boost MPL 为此提供了编译时构造,例如:

typedef boost::mpl::vector<int, double, std::string, CustomA, CustomB> seq_of_types;

您可以使用 mpl 中定义的大量元函数集在编译类型中与之交互。还有一些运行时交叉功能。这里的重点是这是一个类型的序列,没有每个类型的实例可以与之交互。甚至运行时函数也只允许与类型交互。

Boost Fusion(和 std::tuple)在这里提供一个运行时异构容器,例如

boost::fusion::vector<int, double, std::string> v{10, 100., "Foo"};

现在在编译时,您可以访问每个条目的类型信息,并且在运行时您可以使用序列中每个类型的实例。

您尝试实现的目标可能可以通过简单的继承来完成,而不必求助于上述方法,因此该 vector 包含一个指向基类的指针,该基类具有一个在派生类中被覆盖的虚函数哪个做你想要的。这可能是最干净的。

或者,如果您使用 可变参数类型,例如 boost::variant,也可以不用继承,例如:

std::vector<boost::variant<int, double, std::string>> entries;

现在每个条目都是intdoublestd::string 类型之一。然后在迭代时,您可以使用静态访问者对特定实例进行操作。我想我刚才已经回答了一个关于 SO 的问题,这证明了这一点。

那会是哪个呢?

编辑:根据您最后的评论,后者(变体)并没有真正实现,普通继承也没有。我认为融合 vector 也不是必需的,因为您不需要每种类型的实例。最适合你的是mpl::vector,并使用运行时函数mpl::for_each

关于c++ - typedef vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19539345/

相关文章:

c++ - 使用T的默认构造函数作为默认初始值

PHP/C++ : Inject values into EXE file

c++ - `*(unsigned int*)((unsigned int)block + n*i)`是什么意思

c# - 将属性表单对象复制到另一个对象的扩展方法,第一次尝试

objective-c - iOS 模糊文本 : detecting & solving it once and for all?

c++ - 为同一对象管理多个流运算符(operator<<, >>)

.net - 默认参数和反射 : if ParameterInfo. IsOptional 那么DefaultValue总是可靠的吗?

c++ - 使用原子锁定免费的单个生产者多个消费者数据结构

c++ - 传递 constexpr 对象

c++ - gdb catch throw,这个线程