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

tjw*_*992 0 c++ templates interface generic-programming

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();
}
Run Code Online (Sandbox Code Playgroud)

用法示例:

S1 obj1;
S2 obj2;

call_method(obj1);
call_method(obj2);
Run Code Online (Sandbox Code Playgroud)

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

期望的结果是编写一个可以使用S1或S2对象的函数,而无需关心它是哪一个,只要它们提供包含"method()"的接口即可.

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

sup*_*per 5

这非常好,通常在很多情况下使用.例如,处理标准库中的通用容器或不同类型的迭代器.

如果传入的类型没有适当的方法,您将收到编译错误.

如果您愿意,可以使用SFINAE确保传入的类型属于您期望的类型.有时可以是好的或有用的,但通常不需要.

更新: static_assert是@Evgeny指出的另一种在模板上设置约束的有用方法