我想能够定义

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/

10-13 06:49