为什么不使用非类型模板参数实现 std::bind 的占位符?
Why aren't placeholders for std::bind implemented using non-type template parameters?
我知道这个问题比较理论化,但我认为占位符是否会被定义为模板,例如:
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
的占位符?
C++11 中不存在变量模板,这是 std::bind
被添加到语言中的地方。
_1
名称很短,取自 std::bind
的开发地 boost
。
您可以轻松编写自己的类似占位符。
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
占位符,在每个重要方面等同于 _1
。
考虑到这样做的能力,坦率地说,与 lambda 相比,使用 std::bind
是多么烦人,我认为没有人愿意将这样的功能实际添加到标准 post C++14.
我知道这个问题比较理论化,但我认为占位符是否会被定义为模板,例如:
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
的占位符?
C++11 中不存在变量模板,这是 std::bind
被添加到语言中的地方。
_1
名称很短,取自 std::bind
的开发地 boost
。
您可以轻松编写自己的类似占位符。
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
占位符,在每个重要方面等同于 _1
。
考虑到这样做的能力,坦率地说,与 lambda 相比,使用 std::bind
是多么烦人,我认为没有人愿意将这样的功能实际添加到标准 post C++14.