gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:43:45 24 4
gpt4 key购买 nike

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

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()或类似的相同效果而无需额外开销?

最佳答案

我不知道有什么内置模板,但是创建自己的模板并不难(一旦内联,就没有开销):

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 对象或普通函数指针。

关于c++ - 下标运算符的标准 C++ 函数对象模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18306849/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com