6

假设我目前有一个这样的模板函数:

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

  // do various other things...

  return &obj[key];
}

而且我想让下标操作可配置,以便用户可以将自己的代码应用于映射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);
}

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

如果没有为此的标准模板,我最好创建自己的模板,还是有某种方法可以使用std::bind()或类似的效果而不需要额外的开销?

4

1 回答 1

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];
    }
};

你甚至可以有一个处理隐式类型的(我最喜欢这个):

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)];
    }
};

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

于 2013-08-19T05:34:40.300 回答