【发布时间】:2017-07-21 12:52:19
【问题描述】:
假设我们有以下对象:
struct A{
static const int ID = 1;
};
struct B{
static const int ID = 2;
};
struct C{
static const int ID = 3;
};
struct D{
static const int ID = 4;
};
struct Collection{
std::vector<A> o1;
std::vector<B> o2;
std::vector<C> o3;
std::vector<D> o4;
};
Collection collection;
我想要做的是获取对Collection 的一些vectors 的引用。应该有三种不同的方式来检索这些:
按
vector的类型,例如collection.get<A>();按编译时的 ID,由
vector持有的每个对象定义,例如collection.get<4>();- 在运行时按 ID,例如
collection.get(id);
案例 1 很简单,因为它可以通过 T::ID 转换为案例 2。案例 2 可以通过模板专业化来实现(尽管如果我有很多对象,它看起来很丑)。
案例 3 很麻烦。如果没有一些巨大的 if 或 switch 语句,它几乎是不可能的,更不用说推断返回类型了。
我的问题是:
- 有没有办法让案例 2 更优雅?
- 我应该如何实现案例 3?
【问题讨论】:
-
会一直只有
A, B, C, D吗? -
可能没有,至少会有 30 个。
-
你有一个运行时值。你不知道它是什么。您需要根据该值对不同的类型进行操作,这意味着完全不同的代码路径(即使它是同一函数模板的不同实例化)。这意味着一个运行时分支。所以,你要么有
switch要么有map<int,function>- 这些都是你的选择。 -
但是我如何从
switch语句中返回vector?编译器抱怨无法推断返回类型。 -
你不能 - 开关需要分派到特定类型的代码路径中。把它想象成一个访客。