可能传递给构造函数的不同类

时间:2014-08-20 23:08:57

标签: c++ stl

我的类的构造函数可以传递给它的两个不同的类。但是我无法提前知道它将是什么类型,所以我可以将其类型声明为数据成员来初始化它。我怎么知道哪种对象传递给我的构造函数。我希望这可以完成没有提升。

我正在传递一个迭代器。它可以是const迭代器(v.cbegin())或非const(v.begin()):

struct iterator
{
    iterator(IteratorType it)
        : m_it(it)
    { }
IteratorType m_it;
};

以下是我如何调用构造函数:

iterator X::begin()       { return iterator(x.begin()); }
iterator X::begin() const { return iterator(x.cbegin()); }

3 个答案:

答案 0 :(得分:3)

你实际上并不想知道哪些参数类型被传递给你的ctor,因为那时候这个类已经在构建中了,它的类型是一成不变的。

您想要的是根据需要早期干预的参数来决定使用哪个类 不过,解决方案很简单:

使用工厂函数和模板类(<iterator>和标准库的其他部分有很多这种模式的例子)

template<class It>
struct myiterator
{
    myiterator(It it) : m_it(it) { }
private:
    typename std::iterator_traits<It>::type m_it;
    // The above will choke if It is not an iterator
};

template<class... X> auto make_myiterator(X&&.. x)
-> myiterator<typename std::decay<X>::type>
// Only the first arguments type is passed on.
{
    using just_making_sure_it_is_an_iterator =
        std::iterator_traits<typename std::decay<X>::type>::type;
    return {std::forward<X>(x)...};
}

答案 1 :(得分:0)

我通过使用评论中建议的模板解决了这个问题:

template<typename It>
struct iterator
{
    iterator(It it) : m_it(it) { }
private:
    It m_it;
};

答案 2 :(得分:0)

如果您的目标是确定您在班级中持有哪种类型,只需按住更多&#34; general&#34;类型,那么你可以这样做:

实现这两个类的公共接口类,并使用此类型作为构造函数参数&amp;属性。在你的界面中,设置一个方法契约,它返回你的类型(即字符串或枚举值等)。然后,在不同的实现中对这两​​个类实现此方法。

public class Iterateable
{
  public:
    //Ctors/Dtors etc....

    //Pure virtual method.
    virtual string getType() = 0;


}

public class IteratorType1 : public Iterateable
{
 public:
    //Ctors/Dtors etc....

    string getType {return "IteratorType1";}
}

public class IteratorType2 : public Iterateable
{
  public:
    //Ctors/Dtors etc....

    string getType {return "IteratorType2";}
}

struct iterator
{
    iterator(Iterateable it)
        : m_it(it)
    { }
Iterateable m_it;
};

然后,您可以保存任何实现Iterateable接口的类型的对象。 然后,通过属性调用getType(),您可以确定类型,因为将调用在属性上的实例的主要派生类上实现的方法(这是一个名为late binding的语言功能)。 / p>