我希望能够定义
template <class TX>
void f(const TX &x){ ... }
template <class TY>
void f(const TY &x){ ... }
其中TX必须从BaseX派生而TY必须从BaseY派生(我如何指定这种东西?),我希望能够将其称为
f(DerivedX<T>())
最重要的是我可以避免指定模板参数。这是可能的,如果是这样,我将如何实现它?如果不可能,有没有办法让模板化函数只接受某些类型,但仍然可以隐式实例化它?我不能只是让f的重载接受基类,因为我需要派生类'type。
答案 0 :(得分:6)
您可以像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库仅限标题,因此您无需链接任何内容。
答案 1 :(得分:-1)
template <class TX>
void f(const BaseX &x){ ... }
template <class TY>
void f(const BaseY &x){ ... }
f<DerivedX>(DerviedX<T>())
这对我来说似乎最容易。如果您不想提供显式模板参数,可以使用boost is_base_of。