小编tea*_*ode的帖子

在Interface中覆盖模板成员

是否可以使用模板方法声明某种类型的基类,我可以在派生类中重写它?以下示例:

#include <iostream>
#include <stdexcept>
#include <string>

class Base
{
public:
    template<typename T>
    std::string method() { return "Base"; }
};

class Derived : public Base
{
public:
    template<typename T>
    std::string method() override { return "Derived"; }
};

int main()
{
    Base *b = new Derived();
    std::cout << b->method<bool>() << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我希望Derived作为输出,但它是Base.我假设有必要创建一个模板化的包装类,它接收实现类作为模板参数.但我想确定一下.

c++ templates

7
推荐指数
2
解决办法
1万
查看次数

为基类设计基迭代器

我目前正在设计一个接口(Base在下面的例子中),它提供了几个虚拟方法,包括begin()end()。这两个方法简单地返回相应的迭代器,就像在任何其他集合(如类)中一样。派生类应该实现这些方法并返回它们对迭代器的特定实现。

以下(简化的)示例显示了一个派生类,它使用 aboost::transform_iterator来转换整数的私有内部列表。这个实现只是现实中的一个例子,迭代的“事物”可以是其他东西,迭代器也是如此。

该示例有效,但我有一个问题。对象类型main()并没有隐藏使用的迭代器类型为 的事实TransformIterator。基类将用于某种插件架构,其中每个插件都是一个共享库。插件不应该知道使用哪种类型的迭代器,而应该完全依赖于抽象接口。有没有办法做到这一点?

#include <boost/iterator/transform_iterator.hpp>

#include <iostream>
#include <string>
#include <vector>

template<class Iterator>
class Base
{
public:
    virtual Iterator begin() = 0;
    virtual Iterator end() = 0;
};

struct toString
{
    std::string operator()(int number) const
    {
        return std::to_string(number);
    }
};

typedef boost::transform_iterator<toString, std::vector<int>::iterator> TransformIterator;

class Derived : public Base<TransformIterator>
{
public:
    Derived() : ints{132, 3, 6451, 12, 5} {}

    TransformIterator begin()
    {
        return boost::make_transform_iterator(ints.begin(), toString());
    } …
Run Code Online (Sandbox Code Playgroud)

c++ iterator c++11 template-classes

4
推荐指数
2
解决办法
3410
查看次数

标签 统计

c++ ×2

c++11 ×1

iterator ×1

template-classes ×1

templates ×1