如何强制模板从 BaseClassA 派生?

发布于 2024-10-17 07:56:20 字数 176 浏览 1 评论 0原文

是否有可能强制模板来自某个基类,以便我可以调用基类函数?

template <class T>
void SomeManager::Add(T)
{
    T->CallTsBaseClassFunction();
    //... do other stuff
}

Is there any possibility to force a template to be from a certain base class so that I can call the base class function?

template <class T>
void SomeManager::Add(T)
{
    T->CallTsBaseClassFunction();
    //... do other stuff
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

丶情人眼里出诗心の 2024-10-24 07:56:20

当然,您可以将类型特征与 SFINAE 结合起来:

#include <type_traits>

template <class T>
typename std::enable_if<std::is_base_of<your_base_class, T>::value, void>::type
SomeManager::Add(T)
{
    T->CallTsBaseClassFunction();
    //... do other stuff
}

尽管我并没有真正看到这里的好处。

Sure, you can combine type traits with SFINAE:

#include <type_traits>

template <class T>
typename std::enable_if<std::is_base_of<your_base_class, T>::value, void>::type
SomeManager::Add(T)
{
    T->CallTsBaseClassFunction();
    //... do other stuff
}

Although I don't really see the benefit here.

清眉祭 2024-10-24 07:56:20

值得一提的是,它可以使用 static_assert 在编译时以更具可读性的方式完成。大致如下:

class Base {};

template<class B>
class Template{
    static_assert(std::is_base_of<Base, B>::value, "B must derive from nmspc::Base");
}

即使 B 恰好是 Base,它也能工作。
如果 Base 本身就是一个模板类,它会变得更加复杂,但仍然可以完成,并且网上有大量资源。

Worth to mention that it can be done at compile time in a more readable fashion with static_assert. Something in the lines of:

class Base {};

template<class B>
class Template{
    static_assert(std::is_base_of<Base, B>::value, "B must derive from nmspc::Base");
}

It works even when B is exactly Base.
If Base is itself a templated class it becomes more complicated but it can still be done and there's plenty of resources online.

腹黑女流氓 2024-10-24 07:56:20

最简单的解决方案是添加一段代码,仅在您期望的情况下才进行编译:

template <class T>
void SomeManager::Add(T t)
{
    assert((Base const*)&t); // T must inherit from Base to allow T*->Base* conversion.
    t.CallTsBaseClassFunction();
    //... do other stuff
}

The easiest solution is to add a snippet of code that compiles only if it's what you expected:

template <class T>
void SomeManager::Add(T t)
{
    assert((Base const*)&t); // T must inherit from Base to allow T*->Base* conversion.
    t.CallTsBaseClassFunction();
    //... do other stuff
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文