STD ::功能的类型扣除额
Type deduction for std::function
以下代码不会在编译时间调用匹配的std ::函数构造函数。
template <typename X, typename Y>
Y invoke(std::function<Y(X)> f, X x) {
return f(x);
}
int func(char x) {
return 2 * (x - '0');
}
int main() {
auto val = invoke(func, '2');
return 0;
}
但是是否可以提供与上面示例相同(或相似)的功能?是否有一种优雅的方法可以接受任何可召唤的功能:
invoke([](int x) -> int { return x/2; }, 100); //Should return int == 50
bool (*func_ptr)(double) = &someFunction;
invoke(func_ptr, 3.141); //Should return bool
?
#include <functional>
#include <cassert>
template <typename F, typename X>
auto invoke(F&& f, X x) -> decltype(std::forward<F>(f)(x)) {
return std::forward<F>(f)(x);
}
int func(char x) {
return 2 * (x - '0');
}
bool someFunction(double) {return false;}
int main() {
auto val = invoke(func, '2');
assert(val == 4);
auto val2 = invoke([](int x) -> int { return x/2; }, 100);
assert(val2 == 50);
bool (*func_ptr)(double) = &someFunction;
bool b = invoke(func_ptr, 3.141);
return 0;
}
http://melpon.org/wandbox/permlink/zpkzi3sn1a76skm8
实时样本
以模板参数为单位:
template <typename Func, typename Arg>
auto invoke(Func&& f, Arg&& x) -> decltype(f(std::forward<Arg>(x))) {
return f(std::forward<Arg>(x));
}
我会再进一步进行参数,以便您不仅限于单arg可可:
template <typename Func, typename... Args>
auto invoke(Func&& f, Args&&... x) -> decltype(f(std::forward<Args>(x)...)) {
return f(std::forward<Args>(x)...);
}
相关文章:
- 有没有办法通过使用十进制 ASCII 代码自动类型扣除来获取字符?
- 基于返回类型的转换和过载扣除
- 有什么方法可以包装自动类型扣除的助推"tee"流的构造?
- C++从成员类型中扣除类型的功能模板?
- 防止 lambda 的返回类型扣除
- 对'auto'扣除类型的困惑
- C++11中的自动类型扣除和类型转换有什么区别
- 依赖类型自动扣除
- 为什么使用某些类型特征的模板类型会导致模板扣除失败
- C++ 临时值的模板类型扣除
- 函数返回值的自动类型扣除
- 扣除指南的尾随回报类型不是专门化
- 扣除其他类型的依赖类型
- 具有默认值的参数的自动类型扣除
- C 17类模板参数类型扣除 - 可读性
- 使用ENABLE_IF和SFINAE时,功能参数类型扣除(std容器,例如向量)失败
- STD ::功能的类型扣除额
- 自动模板类型扣除额令人困惑的指针和参考
- C :自动变量扣除额的范围与循环的范围与多维阵列的循环的正常范围
- 从非类型模板参数中扣除值类型