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

标签 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();
}

使用示例:

S1 obj1;
S2 obj2;

call_method(obj1);
call_method(obj2);

这段代码可以正常编译和工作,但 IDE 总是会报错。这样可以吗?或者是否有更好的设计我应该知道以获得相同的预期结果。

期望的结果是编写一个可以使用 S1 或 S2 对象的函数,只要它们提供包含“method()”的接口(interface)即可。

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

最佳答案

这完全没问题,而且在很多情况下都很常用。例如,处理标准库中的通用容器或不同类型的迭代器。

如果传入的类型没有合适的方法,您将得到一个编译错误。

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

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

关于c++ - 通过模板函数调用未知类型的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51712380/

相关文章:

c++ map 不返回 end() 即使它应该

C++甚至更通用的运算符模板

java - 如何区分设计模式和标准多态性

Cocoa:ABPeoplePickerView - 如何在单击一个人时触发方法?

c++ - 一个具有 unique_ptr 字段但具有不同删除器的结构

C# 从接口(interface)转换类型

c++ - 编译 C++ 应用程序,以便它们也可以在其他计算机上工作

Java 可选与 C++ 可选

c++ - 我如何用 C 中的按位或其他高效代码实现逻辑蕴涵?

c++ - 专门化派生类中的模板成员