如何使用模板参数选择方法调用?

时间:2013-12-11 21:01:25

标签: c++ templates types

我有一个模板化的方法,我希望它根据模板调用不同的方法。我之所以这样,是因为调用者不需要创建一个B类型的对象来获得正确的实现调用,而是应该能够通过模板化来实现选择。

问题是我正在接收const作为模板T的引用类型,我不知道如何使用它来选择正确的重载方法。理想情况下,如果T不是引用类型,这也会起作用。有什么想法吗?

注意:我不能使用模板专业化,因为我需要impl virtual。

#include <iostream>
using namespace std;

class A {};
class B {};

class C {
public:

    template <typename T>
    void f() {
        // T = const B&
        impl(T()); // error: value-initialization of reference type ‘const B&’
    }

protected:
    virtual void impl(const A& a) {
        cout << "A";
    }

    virtual void impl(const B& b) {
        cout << "B";
    }
};

int main() {
    C c;
    const B &b2 = B();
    c.f<decltype(b2)>(); // T = const B&
    return 0;
}

2 个答案:

答案 0 :(得分:0)

如果您希望获得可能更具可构造性的类型,则应删除所有引用,例如,使用std::remove_reference<T>和所有限定符,例如使用std::remove_cv<T>。 ......或者,只是std::decay<T>类型,它也将数组转换为指针:

template <typename T>
void f() {
    impl(typename std::decay<T>::type());
}

答案 1 :(得分:0)

您仍然可以通过帮助私有模板调度程序使用模板专门化来调用impl的正确版本 - 它仍然可以是虚拟的。像这样,compiles and runs

#include <iostream>
using namespace std;

class A {};
class B {};

class C {
public:

    template <typename T>
    void f() {
        // T = const B&
        impl_dispatch<T>(); // error: value-initialization of reference type ‘const B&’
    }

protected:
    virtual void impl(const A& a) {
        cout << "A";
    }

    virtual void impl(const B& b) {
        cout << "B";
    }
private:
   template <typename T>
   void impl_dispatch();
};

template <>  void C::impl_dispatch<A const &>()
{
impl(B());
}

template <>  void C::impl_dispatch<B const &>()
{
impl(A());
}

int main() {
    C c;
    const B &b2 = B();
    c.f<decltype(b2)>(); // T = const B&
    return 0;
}