为什么不使用非类型模板参数实现std :: bind的占位符?

时间:2016-08-09 16:03:18

标签: c++ templates c++14 template-meta-programming stdbind

我知道这个问题相当理论化,但我认为如果将占位符定义为模板,例如:

namespace std { 
   namespace placeholders {
      template <size_t> struct placeholder { constexpr placeholder() {}; }; 
      template <size_t N> constexpr placeholder<N> _{};
   }
}

用法:

std::bind(foo, std::placeholders::_<1>, std::placeholders::_<2>); 

或者对于c ++ 11:

namespace std { 
   namespace placeholders {
      template <size_t> struct _ { }; 
   }
}

用法:

std::bind(foo, std::placeholders::_<1>{}, std::placeholders::_<2>{});

代码不会失去任何清晰度,我们可以使用它做一些奇特的元编程。那么......为什么不使用非类型模板参数实现std::bind的占位符?

1 个答案:

答案 0 :(得分:7)

C ++ 11中不存在变量模板,这是std::bind添加到语言中的地方。

_1名称为short,取自开发boost的{​​{1}}。

您可以轻松编写自己的类似占位符。

std::bind

现在namespace my_placeholders { template <int> struct placeholder { constexpr placeholder() {}; }; template <int N> constexpr placeholder<N> _{}; } namespace std { template<int N> struct is_placeholder< ::my_placeholders::placeholder<N> >: std::integral_constant<int, N> {}; } 是一个有效的my_placeholders::_<1>占位符,在每个重要方面都等同于std::bind

鉴于能够做到这一点,坦率地说,与lambda相比,使用_1是多么烦人,我可以看到没有人为实际将这样的功能添加到标准的C ++ 14中而烦恼。 / p>