首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从非模板类到模板子类的dynamic_cast

从非模板类到模板子类的dynamic_cast
EN

Stack Overflow用户
提问于 2020-02-28 18:30:38
回答 1查看 72关注 0票数 0

我有一个非模板类NC和一个派生模板类TC。我想转换一个指向NC的指针,它可能是指向TC实例的指针,指向TC指针。模板的实际类型仅限于bool、int和string。

代码语言:javascript
复制
class NC {
...
}

template <typename T>
class TC: public NC {
private:
    T value;
public:
    ...
    void setValue(T value) {
        this->value = value;
    }
}

class UserValueProvider {
public:
    int getValue() const { return 5; }
    bool getValue() const { return true; }
    string getValue() const { return "foobar"; }
}

void setUserValue(UserValueProvider *uvp, NC *obj) {
    auto tobj = dynamic_cast< ? >(obj);        // what goes here?
    if(tobj)
        tobj->setValue(uvp->getValue());
}

显而易见的解决方案是执行3次动态强制转换(针对int、bool和string),并调用专用实例的setValue。然而,我想知道是否有另一种解决方案,因为可能的专业化越多,就越需要更多的动态强制转换,并且更有可能忘记一个专业化。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-28 18:42:14

这里的一种解决方案是翻转调用,并使用虚拟函数。但首先,让我们重写UserValueProvider::getValue,因为只对返回类型进行重载是被禁止的。

代码语言:javascript
复制
class UserValueProvider {
    template <class T> struct tag { };
    int getValue(tag<int>) const { return 5; }
    bool getValue(tag<bool>) const { return true; }
    std::string getValue(tag<std::string>) const { return "foobar"; }

public:
    template <class T>
    T getValue() const {
        return getValue(tag<T>{});
    }
};

现在我们可以调用uvp.getValue<T>()来获取相应的值。接下来,向NC及其派生类添加一个虚函数:

代码语言:javascript
复制
class NC {
public:
    virtual void setValueFrom(UserValueProvider &uvp) = 0;
};

template <typename T>
class TC: public NC {
private:
    T value;
public:
    void setValue(T value) {
        this->value = value;
    }

    void setValueFrom(UserValueProvider &uvp) override {
        setValue(uvp.getValue<T>());
    }
};

瞧,你只需将你的UserValueProvider传递给你的类型擦除的NC,它就会正确地分派。

代码语言:javascript
复制
void setUserValue(UserValueProvider *uvp, NC *obj) {
    obj->setValueFrom(*uvp);
}

See it live on Wandbox

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60449853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档