C ++您可以模板专门化类成员吗?

时间:2019-04-17 12:19:46

标签: c++

我有一个类A,它由类B的两个元素组成。我有一个模板成员函数,它采用类型B的元素。MemberFunc()使用B中的一个。 MemberFunc()使用另一个。

我怎么得到类似的东西:


    class A { 
        B obj 
        B obj 
    }

例如调用obj的模板函数;选择正确的人?

我知道我可以使用数组,但考虑到我要表达的内容,那将是一个黑客。

1 个答案:

答案 0 :(得分:6)

您可以尝试以下方法:

template<bool Cond>
void method() {
     B& b = Cond ? true_obj : false_obj;
     // .....
}

其他:如果要将其扩展到bool实际上是枚举时,以防存在两个以上类型B的对象。换句话说,您想选择一个基于在enum上。那么,来自模板的值将保持不变。

一堆ifswitch不起作用的唯一情况是在不同类型的对象之间进行选择,但这在这里似乎不是这种情况。 / 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更好,因为它表达的意图比其他任何事物都要好得多。如果可以使用它们,则数组(或元组)同样清晰。