c++ - 如何让模板化函数重载接受来自不同基类的派生类?

标签 c++ inheritance templates

我希望能够定义

template <class TX>
void f(const TX &x){ ... }
template <class TY>
void f(const TY &x){ ... }

其中 TX 必须从 BaseX 派生,TY 必须从 BaseY 派生(我如何指定这种事情?),我希望能够将其称为

f(DerivedX<T>())

最重要的是我可以避免指定模板参数。这可能吗?如果可以,我将如何实现?如果不可能,有没有办法让模板化函数只接受某些类型,但仍然隐式实例化它?我不能只让 f 的重载接受基类,因为我需要派生类的类型。

最佳答案

您可以使用is_base_of来自Boost.TypeTraits像这样:

#include <boost/type_traits.hpp>
#include <boost/utility.hpp>

class BaseX { };
class BaseY { };

class DerivedX : public BaseX { };
class DerivedY : public BaseY { };

template <typename TX>
boost::enable_if<boost::is_base_of<BaseX, TX>, void>::type
f(const TX& x) 
{
}

int main(int argc, char** argv)
{
    DerivedX x;
    DerivedY y;

    f(x); // compiles
    f(y); // will cause a compilation error
}

Boost.TypeTraits 库仅包含 header ,因此您无需链接任何内容。

关于c++ - 如何让模板化函数重载接受来自不同基类的派生类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1746352/

相关文章:

c++ - 关于C++中的动态链接库

java - 变量(可能)超出范围

java - 试图弄清楚继承和多态性

c++ - 循环中的模板元编程?

c++ - 类头之外的模板运算符重载实现

c++ - 为什么 ProcessMessages 会抛出 C++ 异常?

c++ - 使用构造函数继承来提供兄弟类型之间的转换

c++ - 创建 "relative"优先级队列的算法? (c/c++)

java - 访问 java 包外部的 BaseClass?

c++ - 函数模板参数推导适用于 gcc,但不适用于 msvc 和 clang