我有一个类A,它由类B的两个元素组成。我有一个模板成员函数,它采用类型B的元素。MemberFunc()使用B中的一个。 MemberFunc()使用另一个。
我怎么得到类似的东西:
class A { B obj B obj }
例如调用obj的模板函数;选择正确的人?
我知道我可以使用数组,但考虑到我要表达的内容,那将是一个黑客。
答案 0 :(得分:6)
您可以尝试以下方法:
template<bool Cond>
void method() {
B& b = Cond ? true_obj : false_obj;
// .....
}
其他:如果要将其扩展到bool实际上是枚举时,以防存在两个以上类型B的对象。换句话说,您想选择一个基于在enum
上。那么,来自模板的值将保持不变。
一堆if
或switch
不起作用的唯一情况是在不同类型的对象之间进行选择,但这在这里似乎不是这种情况。 / p>
enum
是连续的,则可以使用数组。由于您使用的是模板,因此您也可以使用完整的TMP并使用template selector。这是您想做什么的过度杀伤,但是如果需要,它可以用于不同类型的对象。您可以使用std::tuple
来避免像下面的示例那样自己编写选择器:
#include <tuple>
struct B {
void method() {}
};
struct C {
void method() {}
};
struct A {
std::tuple<B, C> objs;
template<bool Cond>
void method() {
auto& o = std::get<Cond>(objs);
o.method();
}
};
void test() {
A a;
a.method<true>();
a.method<false>();
}
我发现
if
更好,因为它表达的意图比其他任何事物都要好得多。如果可以使用它们,则数组(或元组)同样清晰。