Ale*_*ing 3 templates functional-programming c++11
所以在过去的几周里,我一直在尝试使用C++ 11中的问题的函数式编程类型解决方案,并且我经常遇到需要一个返回常量值的函数的情况.
在Haskell中,有一个功能
const :: a -> b -> a
const x = \_ -> x
Run Code Online (Sandbox Code Playgroud)
返回一个函数,该函数计算const的原始参数,无论提供给它的参数是什么.我想在C++ 11中创建类似的东西.这种结构对于表示函数中的特殊行为很有用(发送到过滤器的常量函数将保持数据完整).这是我的第一次尝试:
template<class T>
std::function<T(...)> constF(T x) {
return ([x](...) { return x; });
}
Run Code Online (Sandbox Code Playgroud)
这可以自行编译,但任何使用它的尝试都会导致类型不完整的错误.我的第二次尝试是这样的:
template<class T, class... Args>
std::function<T(Args...)> constF(T x) {
return ([x](Args...) { return x; });
}
Run Code Online (Sandbox Code Playgroud)
这更接近,但不允许我提供任何参数,除非我明确说明它们.
auto trueFunc1 = constF(true);
auto trueFunc2 = constF<bool, int>(true);
cout << trueFunc1() << endl; //works
cout << trueFunc1(12) << endl; //doesn't compile
cout << trueFunc2(12) << endl; //works
Run Code Online (Sandbox Code Playgroud)
理想情况下,正确的构造在trueFunc1和trueFunc2之间不会产生任何差异.
这在C++中是否可行?
由于C++ 11没有泛型或可变参数lambda,我会编写一个仿函数模板类:
template <typename T>
// requires CopyConstructible<T>
class const_function {
T value;
public:
template <typename U, typename = typename std::enable_if<std::is_convertible<U,T>::value>::type>
const_function(U&& val) :
value(std::forward<U>(val)) {}
template <typename... Args>
T operator () (Args&&...) const {
return value;
}
};
Run Code Online (Sandbox Code Playgroud)
和一个很好的类型推导包装器来使它们:
template <typename T>
const_function<typename std::remove_reference<T>::type>
constF(T&& t) {
return {std::forward<T>(t)};
}
Run Code Online (Sandbox Code Playgroud)
在C++ 1y中,我认为简单的等价物是:
template <typename T>
auto constF(T&& t) {
return [t{std::forward<T>(t)}](auto&&...){return t;};
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
138 次 |
| 最近记录: |