我知道这个问题相当理论化,但我认为如果将占位符定义为模板,例如:
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
的占位符?
答案 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>