我可以调用作为模板参数的对象的任何方法吗
Can I invoke any method of an object that is a template argument?
假设我有一个模板函数,如下所示:
template<typename T> void do_something(T object, string type){
if(type == "class_1"){
int result = object.class_1_method();
else if(type == "class_2"){
int result = object.class_2_method();
}
}
这似乎在编译时引发了一个问题——编译器似乎正在遍历每个逻辑路径,并针对类型为class_2
的对象测试class_1_method()
,然后意识到class_2
没有该方法。有没有办法解决这个问题,或者每个可能的类型名T
都需要有能力成功地通过每个可能的逻辑路径?
对于给定的类型,整个函数需要是可编译的,否则将发生错误。
看起来你真正想要的是模板专业化:
template <typename T> void do_something(T object);
template <>
void do_something<class_1> (class_1 object)
{ int result = object.class_1_method(); }
template <>
void do_something<class_2> (class_2 object)
{ int result = object.class_2_method(); }
模板不是直接执行的代码,它是编译器用来为代码中安装模板的每种类型生成代码的模型。当你编写一个模板时,你以某种方式声明了一个接口,你安装模板的每种类型都必须符合这个接口
在您的情况下,如果您使用类型为Class1
的参数调用do_something
,则在模板安装后,您将得到以下等效项
do_something(Class1 object, string type){
if(...){
int result = object.class_1_method();
else (...){
int result = object.class_2_method();//Err... not in Class1
}
}
显然无法编译。
在类型上分支的一种方法是使用模板专门化。
简单的重载也可以:
void do_something(Class1 const& object, string type){
int result = object.class_1_method();
}
void do_something(Class2 const& object, string type){
int result = object.class_2_method();
}
重载通常比模板专业化更容易掌握。
相关文章:
- 为什么静态数组成员变量在调用对象的实例后不显示任何内容?
- 检查模板中 nullptr 的函数指针,了解任何类型的可调用对象
- 如何在 if 语句中声明对象并在任何我想的地方使用它?
- 如果普通默认构造函数不执行任何操作,为什么我们不能使用 malloc 创建平凡可构造的对象?
- 在将匿名对象作为参数传递时,不会调用任何构造函数
- 如何将任何值转换为对象并使用 boost::p roperty_tree json 添加成员
- 在任何地方对C++中所有并行线程中的所有锁定和解锁实例使用相同的 std::mutex 和 lock 对象
- 在DelphiInterface上实现Dynamic_cast以获取基础对象类的任何方法
- std::unordered_set 是否对任何对象进行摊销常量查找时间,而不考虑谓词
- C++/(Qt) 指向具有特定方法的任何对象的指针
- 如果类没有任何成员变量,则通过临时对象调用类的成员函数的开销是多少?
- 我们如何在c 中序列化或应对类的对象.是否有任何预定义的库
- C++包含任何类型的模板类对象的映射
- 原子对象在普通对象安全的任何上下文中都是不安全的
- 是否有任何可能的方法将事件(自定义)附加到在运行时创建的对象?[C 构建器]
- 声明矢量和指针而无需创建任何类型的对象
- OPENCV SVM-对象不属于任何受过训练的类
- 将任何数据类型/对象作为参数传递以确定其大小
- 调用不访问已删除对象中的任何类成员的类方法是否安全
- 为什么重载运算符上的异常说明符'<<'不适用于任何 std::ostream 对象,但对库中定义的运算符不起作用?