【发布时间】:2015-10-04 17:31:03
【问题描述】:
我有一个类层次结构,其中基类包含一个函数,该函数根据接收到的参数测试dynamic_cast 指向派生模板类型的this 指针。
问题是dynamic_cast 运算符检查参数是否完全匹配,并考虑它们是否为 ref。我需要以下示例来处理这两种情况,有没有办法这样做?
template <typename... P>
struct Derived;
struct Base
{
virtual ~Base() {}
template <typename... P>
void doCast(P&&... p) {
Derived<P...> *res=dynamic_cast<Derived<P...> *>(this);
if (!res)
std::cout<<"Failed."<<std::endl;
else {
std::cout<<"Success."<<std::endl;
res->doSomethingWithP(std::forward<P>(p)...);
}
}
};
template <typename... P>
struct Derived: public Base
{
void doSomethingWithP(P... p) {
/*Whatever, doesn't matter*/
}
};
int main(int argc, char **argv)
{
Derived<int, int, int> derived;
Base *b=&derived;
int x=10;
int y=20;
int z=30;
//The two calls must succeed.
b->doCast(x,y,z); //Failed.
b->doCast(10,20,30); //Success.
return 0;
}
Derived 可以接受既是值、引用又是指针的类型 - cv - 限定与否。
【问题讨论】:
-
要清楚 - 你真的会实例化
Derived<int, int&>吗?在这种情况下b->doCast(10, 20);应该怎么做? -
或者说真的,如果
Derived<int>和Derived<int&>都可以的话,b->doCast(x);应该怎么做? -
好的,所以它们可以是对 const 的引用。同样的问题,
Derived<int>或Derived<int const&>? -
如果
this类是int或const int &它应该可以很好地进行两种转换。 -
@LoPiTaL 你不理解这个问题。假设
doCast使用A、B、...、E类型的5 个参数调用。这意味着我们必须潜在地检查 {A,A const&} x {B,B const&} x {C,C const&} x ... 那是 32 个潜在的Derived类型!
标签: c++ c++11 variadic-templates dynamic-cast perfect-forwarding