我使用C ++ 11.我有一个Base
类和几个派生类,用于逐行解析不同的配置文件。
template <class T>
class Base
{
public:
virtual ~Base();
bool load_from_file(const QString& str);
virtual void* get_data(const QString& str) const = 0;
private:
QList<QSharedPointer<T> > items_;
};
每个后代(class Derived: public Base<My_struct>
)必须提供get_data()
实施
每个My_struct
实例都包含来自设置文件某一行的信息。
例如,想象一下具有代理列表的典型文件
My_struct
实例包含在Base
方法的load_from_file()
类中的智能指针中,并附加到items_
成员。 load_from_file()
方法在换行前将void*
转换为T*
。
是否可以重新设计这些类,以避免使用void*
(并且没有像boost::any
这样的库)?
我的意思是考虑CRTP等。通常,CRTP示例包含具有void
返回值的派生类的方法(如Pascal中的过程)。
答案 0 :(得分:1)
兄弟!尝试切换到C ++ 14并使用以下代码段作为提示:
template <typename Derived>
struct base
{
template <typename T>
auto f(T x)
{
return static_cast<Derived&>(*this).f_impl(x);
}
auto g()
{
return static_cast<Derived&>(*this).g_impl();
}
};
struct derived : base<derived>
{
bool f_impl(int x)
{
return true;
}
double g_impl()
{
return 4.2;
}
};
此片段取自here。