使模板接受特定的类/类系列?

时间:2010-06-24 15:38:59

标签: c++ templates

我有一个模板方法,旨在使用一组特定的类。由于我不需要运行时多态性,所以我决定不使用指向父类的指针,而是让编译器将所有内容放在一起。

我想要限制可以传递给模板的类型,或者在传递不正确的类型时使GCC发出合理的错误。

这可能吗?

3 个答案:

答案 0 :(得分:1)

是。根据当天的具体需要,可以使用多种不同的技术。有boost :: enable_if。有MPL和static_assert ...(如果您没有使用C ++ 0x编译器,请使用BOOST_STATIC_ASSERT)。有Boost.Concepts。

是。这是可能的。

答案 1 :(得分:0)

另一方面,您也可以不使用模板。

假设您希望该方法仅在CarDog上运行。显然这两者完全无关......但他们仍然可以继续前进。

// move.h
#include <boost/variant.hpp>

class Car;
class Dog;

typedef boost::variant<Car*,Dog*> move_type;

void move(move_type m);


// move.cpp
#include <boost/apply_visitor.hpp>

#include "car.h"
#include "dog.h"
#include "move.h"

struct Mover: boost::static_visitor<>
{
  void operator()(Car* c) const { c->advance(); }
  void operator()(Dog* d) const { d->run(); }
};

void move(move_type m)
{
  boost::apply_visitor(Mover(), m);
}

这甚至比典型的模板更好,因为实现在源文件中:)

答案 2 :(得分:0)

您可以执行类似Matthieu所说的内容,为您支持的每种类型编写单独的函数(它仍然可以在后端调用模板函数),或者使用动态多态和继承。那些应该是您应该考虑做的事情的唯一选择。

然而,你问的问题让我相信这是对模板和静态多态的误解。函数/类模板通过生成的实际代码对可以使用的类型施加限制。在这些函数/类中使用的公共接口定义了可以接受的类型的约束。没有必要过分强加额外的限制。为什么要限制类/函数模板可以支持的类型而不是已经存在的限制?

假设您编写的函数模板只能用于实现公共接口的类型,该公共接口由生命访问器,终止函数和eat函数(基本上任何生物体)组成。这就是它所设置的约束:您不需要通过减少使用功能模板的类型数量来限制灵活性,或者定义将以这种方式工作的任何特定生物体类型。该模板已经要求实现这种生物体类型的界面。