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

时间:2013-08-19 05:23:35

标签: 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];
}

我想使下标操作可配置,以便用户可以应用自己的代码将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默认调用{ {1}}?我无法在operator[]中看到任何合适的内容。

如果没有这方面的标准模板,我最好创建自己的模板,还是有一些方法可以使用<functional>或类似的相同效果而无需额外开销?

1 个答案:

答案 0 :(得分: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对象或普通函数指针。