通过模板函数对未知类型调用方法

Calling a method on an unknown type through a template function

本文关键字:未知 类型 调用 方法 函数      更新时间:2023-10-16

C++语言允许我编写一个模板函数,该函数将调用传递给该函数的对象上的方法。

这里的问题是,当我这样做时,我的IDE(NetBeans 8.2(会抱怨它无法解决该方法。这是有道理的,因为在我尝试编译代码之前,将用于"T"的类型是未知的,但它会给我一个警告,这让我有点担心这样做是否是糟糕的编程实践。

考虑以下代码:

struct S1 {
void method() const {
cout << "Method called from S1!" << endl;
}
};
struct S2 {
void method() const {
cout << "Method called from S2!" << endl;
}
};
template <typename T>
void call_method(const T& object) {
// IDE reports a warning "can't resolve the template based identifier method."
object.method();
}

用法示例:

S1 obj1;
S2 obj2;
call_method(obj1);
call_method(obj2);

这段代码可以编译并正常工作,但IDE总是会抱怨。这样可以吗?或者有没有一个更好的设计,我应该知道,以获得相同的期望结果。

所需的结果是编写一个函数,该函数可以使用S1或S2对象,而不必关心它是哪一个,只要它们提供了一个包含"method(("的接口。

假设我无法访问S1和S2的源代码,因此我无法对它们进行更改。(例如,我不能让它们从公共基类继承,并使用动态多态性而不是模板函数来实现相同的效果(

这是完全可以的,在很多情况下都很常用。例如,处理来自标准库或不同类型迭代器的通用容器。

如果传入的类型没有合适的方法,则会出现编译错误。

如果您愿意,您可以使用SFINAE来确保传入的类型是您期望的类型之一。有时可能是好的或有用的,但通常不需要。

更新:static_assert是@Evgeny 指出的另一种对模板进行约束的有用方法