在实例化派生类时指定基类模板参数?
我不知道标题是否有意义,但我找不到合适的词语来形容我的“问题”。无论如何,这是我的问题。有一个用于搜索的接口:
template <typename InputType, typename ResultType> class Search {
public:
virtual void search (InputType) = 0;
virtual void getResult(ResultType&) = 0;
};
和几个派生类,例如:
template <typename InputType, typename ResultType>
class XMLSearch : public Search<InputType, ResultType> {
public:
void search (InputType) { ... };
void getResult(ResultType&) { ... };
};
派生类稍后将在源代码中使用。我想在不指定模板参数的情况下保留一个指向 Search
的简单指针,然后分配一个新的 XMLSearch ,从而定义 Search 和 XMLSearch 的模板参数
Search *s = new XMLSearch<int, int>();
我找到了一种在语法上与我类似的方法我正在尝试这样做,但真正使用它似乎有点奇怪:
template <typename T> class Derived;
class Base {
public:
template <typename T>
bool GetValue(T &value) {
Derived<T> *castedThis=dynamic_cast<Derived<T>* >(this);
if(castedThis)
return castedThis->GetValue(value);
return false;
}
virtual void Dummy() {}
};
template <typename T> class Derived : public Base {
public:
Derived<T>() {
mValue=17;
}
bool GetValue(T &value) {
value=mValue;
return true;
}
T mValue;
};
int main(int argc, char* argv[])
{
Base *v=new Derived<int>;
int i=0;
if(!v->GetValue(i))
std::cout<<"Wrong type int."<<std::endl;
float f=0.0;
if(!v->GetValue(f))
std::cout<<"Wrong type float."<<std::endl;
std::cout<<i<<std::endl<<f;
char c;
std::cin>>c;
return 0;
}
有更好的方法来实现这一点吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
是的,这个设计稍微好一点,因为在调用
GetValue()
时使用静态调度(我假设dynamic_cast
是拼写错误,你实际上想要输入Base::GetValue()
中的 >static_cast)。在该设计中,Base::GetValue()
不是虚拟的,但它可以使用以下指针调用Derived::GetValue()
输入基础
。这使得它稍微快一些。但即使是你的方式也没有那么糟糕。您只需像这样实例化您的类模板:
您的
Search *s = new XMLSearch()
是错误!您可以按如下方式
typedef
您的模板:然后使用它们:
这看起来更好,对吧?
小修改
你可以让你的班级在性能方面稍微好一些。为此,请按如下所示编写您的 Search 类模板:
现在您的基类不是抽象的,因为它没有定义虚函数。这个设计比你的版本稍快一些!
Yes, that design is slightly better, since that's using static-dispatching while calling
GetValue()
(I'm assuming thatdynamic_cast
is typo, you actually wanted to typestatic_cast
inBase::GetValue()
). In that design,Base::GetValue()
is not virtual, yet it is able to callDerived::GetValue()
using pointer of typeBase
. This makes it slightly fast.But even your way is not that bad. All you've to instantiate your class templates like this:
Your
Search *s = new XMLSearch<int, int>()
is wrong!You can
typedef
your templates as follows:Then use them:
This looks better, right?
Small Modification
You can make your class slightly better performance-wise. For that, write your Search class template as follows:
Now your base class is not abstract, as it doesn't define virtual functions. This design is slightly faster than your version!