gpt4 book ai didi

c++ - 从参数的返回类型推断类型

转载 作者:搜寻专家 更新时间:2023-10-31 00:28:44 25 4
gpt4 key购买 nike

我知道模板无法从赋值中推断出类型,即

template <typename T>
T aFunction (int a) { /*...*/ }; // This obviously won't work

原因很明显。但这起作用:

template <typename T>
T aFunction (T a, T b) { return a + b; }; // a-ok

'cause T 将从参数中推断出来。我想从中推断:

template <typename T>
T aFunction (std::function<T(int)> a) { return a(3);};
^
|
I specified it! ----------

因此在使用时,函数应该做什么没有歧义:

std::function<double(int)> blah = [](int x){ return x / 2.0f; };
aFunction(blah);

唉,编译器不配合我:

No matching member function for call to 'aFunction'

Candidate template ignored: could not match 'function' against '(lambda at file.hpp:274:16)'

有没有办法做到这一点?缺少模板特化(这是一个非常的泛型类),或者一个伪参数(我还没有那么绝望)。


PD:

完全披露:以上只是问题的简化,正是我需要的是:

template <typename T>
class MyStuff {

template <typename ReturnType>
MyStuff<ReturnType> aFunction(std::function<ReturnType(T)> a){
/*for each stuff in MyStuff do a(stuff)*/
}
}

其中 MyStuff 包含 T 类型的属性和一堆 inline 函数,例如 aFunction

最佳答案

如评论中所述,这有效:

#include <functional>

template <typename T>
struct MyStuff {
template <typename ReturnType>
MyStuff<ReturnType> aFunction(std::function<ReturnType(T)> a){
return {};
}
};

int main() {
MyStuff<int> stuff;
std::function<double(int)> fn = [](int) { return 0.; };
stuff.aFunction(fn);
}

相反,这不起作用:

int main() {
MyStuff<int> stuff;
stuff.aFunction([](int) { return 0.; });
}

错误是问题中发布的错误:

note: candidate template ignored: could not match 'function' against '(lambda at main.cpp:15:21)'

原因是类型推导只适用于精确类型。不允许转换。在您的情况下,编译器应该首先推断出 lambda 的所有返回类型,而不是将其转换为 std::function ,最后从使用构造的函数中推断出函数的返回类型 lambda 。
这不是类型推导的工作方式。

你可以用这样的方法解决它:

template <typename T>
struct MyStuff {
template <typename F>
auto aFunction(F &&f) -> MyStuff<decltype(std::forward<F>(f)(std::declval<T>()))> {
return {};
}
};

查看 Coliru .

关于c++ - 从参数的返回类型推断类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43993703/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com