C++中类似Haskell的`const`

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++中是否可行?

Cas*_*sey 5

由于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)