【发布时间】:2018-10-02 21:17:07
【问题描述】:
我正在编写我自己的 std::async 模拟(必须回到 Intel13/gcc 4.4 STL),这工作正常:
template <typename Func, typename ...Args>
struct return_value {
template <typename T>
using decayed = typename std::decay<T>::type;
using type = typename std::result_of<decayed<Func>(decayed<Args>...)>::type;
};
template <typename Func, typename ...Args>
typename return_value<Func,Args...>::type async(Func &&func, Args&&... args) {
return func(args...);
}
void run(int a, double b) {
printf("a: %i b: %f\n", a, b);
}
int main() {
async(run, 1, 3.14);
}
但如果我为run 添加重载:
void run() {
printf("no args\n");
}
那就不能正常解决:
<source>: In function 'int main()':
<source>:27:23: error: no matching function for call to 'async(<unresolved overloaded function type>, int, double)'
async(run, 1, 3.14);
^
<source>:14:43: note: candidate: 'template<class Func, class ... Args> typename return_value<Func, Args>::type async(Func&&, Args&& ...)'
typename return_value<Func,Args...>::type async(Func &&func, Args&&... args) {
^~~~~
<source>:14:43: note: template argument deduction/substitution failed:
<source>:27:23: note: couldn't deduce template parameter 'Func'
async(run, 1, 3.14);
^
Compiler returned: 1
如何将函数作为模板参数并正确推断给定参数的重载?
【问题讨论】:
-
你可以像标准一样,要求调用者选择他们想要的重载:stackoverflow.com/questions/45966603/…
-
是的,如果可能的话,我想推断它,但似乎应该有可能以某种方式对其进行 SFINAE。
-
您是否希望能够采用对象之类的任何函数,或者您可以将其限制为函数指针或
std::function? -
如果只是函数指针我可能会没事