我有一个模板化的方法,我希望它根据模板调用不同的方法。我之所以这样,是因为调用者不需要创建一个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;
}
答案 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;
}