【发布时间】:2016-08-09 16:03:18
【问题描述】:
我知道这个问题是相当理论化的,但我认为如果将占位符定义为模板,例如:
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>仍然是一种类型,并且您不能将类型作为值传递:您至少需要_<1>{},不是吗?还是template<size_t> struct placeholder {constexpr placeholder() {};}; template<size_t N> constexpr placeholder<N> _{};?当你到达第二个时,你需要变量模板,这在 C++11 中不存在。那么,你想知道什么?
标签: c++ templates c++14 template-meta-programming stdbind