c++ - 模板与继承,如何调用基础虚方法

标签 c++ templates inheritance

我的 C++ 框架有一个类层次结构。还有一个通用的 Collection 类可以处理对象集(比如打印它们)。 这是我简化的类设计:

#include<iostream>
#include<vector>
using namespace std;
class Base {
public:
    virtual void print() const {cout << "B" << endl;}
};
class Derived : public Base {
    int x;
public:
    Derived(int _x) : x(_x) {}
    virtual void print() const {cout << "D" << x << endl;}
};

inline void print_elem(const int e) { cout << e << endl; }
inline void print_elem(const Base& e) { e.print(); }

template<class T>
class Collection {
private:
    vector<T> elems;
public:
    void add(const T& v) { elems.push_back(v); }
    void print() {
        for (unsigned i=0; i < elems.size(); ++i)
            print_elem(elems[i]);
    }
};

int main(int argc, const char *argv[]) {
    Collection<int> c1;
    c1.add(2); c1.add(5);
    c1.print();

    Collection<Derived> c2;
    c2.add(Derived(2)); c2.add(Derived(5));
    c2.print();
}

以上代码编译正常。 问题是关于 print_elem因为我必须为每种支持的类型实现。 我想像这样实现它:

inline void print_elem(const Base& e) { e.print(); }
template<class T>
inline void print_elem(const T& e) { cout << e << endl; }

为 Base 和所有派生类指定实现,所有其他类型应该 <<运算符,但有编译错误说:

template argument deduction/substitution failed:
cannot convert ‘e’ (type ‘const Derived’) to type ‘const unsigned > char*’
inline void print_elem(const T& e) { cout << e << endl; }

编译器是否可能使用 print_elem(const Base& e)与通用模板一起?

最佳答案

SFINAE 助您一臂之力!

如果参数继承自 Base,您可以使用类型特征来防止选择模板打印:

inline void print_elem(const Base& e) { e.print(); }

template<class T, class = std::enable_if_t<!std::is_base_of_v<Base, T> > >
inline void print_elem(const T& e) { cout << e << endl; }

你可以看到一个活生生的例子here

关于c++ - 模板与继承,如何调用基础虚方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47135340/

相关文章:

c++ - 部分特化中模板模板参数内的可变参数模板参数

指向模板类的非静态成员函数的 C++ 函数指针(类成员)

c++ - 在 doxygen 中更改文档代码的版本(不使用宏)

c++ - 使用rvm安装ruby时出错

c++ - 如何为 C++ 模板类中的一个方法提供显式特化?

java - 如何在MVC项目中处理Spring Bean的继承

c++ - 无法返回派生类型的 std::unique_ptr<>

java - 从父类(super class)创建子类

c++ - 声明一个二维 vector

C++:从文件中读取 x y 数据会创建无限循环吗?