我的类的构造函数可以传递给它的两个不同的类。但是我无法提前知道它将是什么类型,所以我可以将其类型声明为数据成员来初始化它。我怎么知道哪种对象传递给我的构造函数。我希望这可以完成没有提升。
我正在传递一个迭代器。它可以是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()); }
答案 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>