下标运算符的标准C++函数对象模板

mar*_*ack 6 c++ c++11

说我目前有这样的模板功能:

template <class T, class K>
void* get_subobject(K key)
{
  T& obj = function_returning_T_ref<T>();

  // do various other things...

  return &obj[key];
}
Run Code Online (Sandbox Code Playgroud)

我想使下标操作可配置,以便用户可以应用自己的代码来映​​射objkey返回值.像这样的东西:

template <class T, class K, class Op = subscript<T, K>>
void* get_subobject(K key)
{
  T& obj = function_returning_T_ref<T>();

  // do various other things...

  return &Op{}(obj, key);
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,对于subscript<T,K>上面的默认模板参数是否有一个标准模板(沿着std::less<T>我的行),我可以在这里使用Op默认调用operator[]?我看不到任何合适的东西<functional>.

如果没有这方面的标准模板,我最好自己创建或者是否有某种方式可以使用std::bind()或类似于相同的效果而无需额外的开销?

Cam*_*ron 2

我不知道有任何内置模板,但创建自己的模板并不太难(一旦内联,就不会产生任何开销):

template<typename T, typename K>
struct subscript
{
    inline auto operator()(T const& obj, K const& key) const -> decltype(obj[key])
    {
        return obj[key];
    }

    inline auto operator()(T& obj, K const& key) const -> decltype(obj[key])
    {
        return obj[key];
    }
};
Run Code Online (Sandbox Code Playgroud)

你甚至可以有一个适用于隐式类型的工具(我最喜欢这个):

struct subscript
{
    template<typename T, typename K>
    inline auto operator()(T&& obj, K&& key) const
        -> decltype(std::forward<T>(obj)[std::forward<K>(key)])
    {
        return std::forward<T>(obj)[std::forward<K>(key)];
    }
};
Run Code Online (Sandbox Code Playgroud)

当然,用户可以传入自己的任何符合类型,包括std::function对象或普通函数指针。