我有一个模板方法,旨在使用一组特定的类。由于我不需要运行时多态性,所以我决定不使用指向父类的指针,而是让编译器将所有内容放在一起。
我想要限制可以传递给模板的类型,或者在传递不正确的类型时使GCC发出合理的错误。
这可能吗?
答案 0 :(得分:1)
是。根据当天的具体需要,可以使用多种不同的技术。有boost :: enable_if。有MPL和static_assert ...(如果您没有使用C ++ 0x编译器,请使用BOOST_STATIC_ASSERT)。有Boost.Concepts。
是。这是可能的。
答案 1 :(得分:0)
另一方面,您也可以不使用模板。
假设您希望该方法仅在Car
和Dog
上运行。显然这两者完全无关......但他们仍然可以继续前进。
// 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函数(基本上任何生物体)组成。这就是它所设置的约束:您不需要通过减少使用功能模板的类型数量来限制灵活性,或者定义将以这种方式工作的任何特定生物体类型。该模板已经要求实现这种生物体类型的界面。