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

C++ 如何让模板函数重载接受来自不同基类的派生类?,c++,inheritance,templates,C++,Inheritance,Templates,我希望能够定义 template <class TX> void f(const TX &x){ ... } template <class TY> void f(const TY &x){ ... } 模板 void f(const TX&x){…} 样板 void f(const-TY&x){…} 其中TX必须从BaseX派生,TY必须从BaseY派生(我如何指定这种类型的东西?),我希望能够将其称为 f(DerivedX<T>())

我希望能够定义

template <class TX>
void f(const TX &x){ ... }
template <class TY>
void f(const TY &x){ ... }
模板
void f(const TX&x){…}
样板
void f(const-TY&x){…}
其中TX必须从BaseX派生,TY必须从BaseY派生(我如何指定这种类型的东西?),我希望能够将其称为

f(DerivedX<T>())
f(DerivedX())
最重要的是,我可以避免指定模板参数。这可能吗?如果可能,我将如何实施?如果不可能,是否有一种方法可以使模板化函数只接受某些类型,但仍然隐式实例化它?我不能让f的重载接受基类,因为我需要派生类的类型。

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

f<DerivedX>(DerviedX<T>())
void f(const BaseX&x){…} 样板 void f(const BaseY&x){…} f(DerviedX())
这对我来说似乎很容易。如果您不想提供显式模板参数,可以使用boost。

您可以使用类似的方法:

#包括
#包括
类BaseX{};
类BaseY{};
DerivedX类:公共BaseX{};
派生类:公共基本类{};
样板
boost::enable_if::type
f(常数发送和发送)
{
}
int main(int argc,字符**argv)
{
DerivedX;
嘲笑;
f(x);//编译
f(y);//将导致编译错误
}

Boost.TypeTraits库仅为页眉,因此您不需要在其中链接任何内容。

附录-如果条件为true,则它仅具有
type
成员,因此如果尝试使用
type
且条件为false,则会导致编译错误。但是,由于一个称为SFINAE(替换失败不是错误)的原则,它只是告诉编译器不要选择该版本的模板。如果有另一个用于
BaseY
,编译器将无法创建这两个模板中的一个,并将被迫使用另一个。因为它将是唯一符合条件的模板,所以它将被选中。好的,我读到了这些,它们似乎就是我想要的。但是,您列出的代码未编译。抱歉,这是复制粘贴失败;再试一次(我从
f
的定义中删除了额外的
void
)。它现在应该可以编译了(如果您删除了
f(y);
,因为它的目的是演示什么会导致编译器错误)。第一个答案是,和-1。
#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
}