通过模板函数对未知类型调用方法
Calling a method on an unknown type through a template function
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 指出的另一种对模板进行约束的有用方法
相关文章:
- Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)
- 使用 make 编译 MPI,几个命名空间错误,例如"错误:未知类型名称'使用'?
- 即使直接从官方示例中复制,也找不到未知类型名称QML_ELEMENT和 QML 模块
- 通过 C++ 中的重载构造函数初始化未知类型的变量
- 线程 std::调用未知类型,无法专门化函数错误
- MacOS 上的 LLVM - 标准文件 iosfwd 中未知类型名称'template'
- C++ 未知类型名称,即使类型是通过标头定义的
- 通过模板函数对未知类型调用方法
- 错误:使用 SWIG 的未知类型名称"类"
- C++:将未知类型的对象存储为成员变量的类
- 为什么未知类型名称"Complejo"?
- 在 Mac OS x 中制造期间出现错误未知类型名称"constexpr"
- 查找上下文RPC_NS_HANDLE未知类型名称
- 错误:未知类型名称"功能跟踪"
- C++中的自由定理:模板是否本质上对未知类型的对象无知和中立?
- 未知 使用用于C++代码的标头编译 C 代码时char16_t未知类型名称
- Linux中未知类型名称UINT64_T和UINT16_T UINT8_T
- 如何确定未知类型数组的索引是否为空
- 当我返回节点*时,C++中出现未知类型错误
- 无法编译任何C++程序;错误:未知类型名称'uint8_t'