如何在`stdfunction`中存储返回值类型不固定的方法?
时间: 2024-09-25 07:05:18 浏览: 28
Java方法签名为何不包含返回值类型
`stdfunction`是C++标准库中的一个模板,用于表示可调用的对象(如函数指针、成员函数、lambda表达式)。如果你想在`stdfunction`中存储返回值类型不固定的方法,通常的做法是使用`std::result_of`来推导返回类型,或者如果你正在使用C++14及以上版本,可以使用模板元编程。
**示例**(假设有一个通用的接口`I`,它的实现类有多种可能的返回类型):
```cpp
template <typename R, typename... Args>
class MyCallable {
public:
using result_type = typename std::result_of<R(Args...)>::type;
// 使用stdfunction存储函数
std::function<result_type(Args...)> func;
// 构造函数接收一个具有不同返回类型的实例并保存
template <typename Callable, typename = std::enable_if_t<std::is_invocable_v<Callable, Args...>>>
explicit MyCallable(Callable&& callable)
: func(std::forward<Callable>(callable))
{}
};
// 实现类I,有不同的返回类型
class IImpl1 {
public:
int method1(int a, int b) { return a + b; }
};
class IImpl2 {
public:
double method2(const char* str) { return strlen(str); }
};
int main() {
MyCallable<int, int, int> c1(IImpl1().method1);
MyCallable<double, const char*> c2(IImpl2().method2);
return 0;
}
```
在这个例子中,`MyCallable`模板持有`std::function`,它可以根据传递给构造函数的具体实现自动推导返回类型。这样,你就可以在同一个`stdfunction`中存储不同类型返回值的方法了。
阅读全文