说我目前有这样的模板功能:
template <class T, class K>
void* get_subobject(K key)
{
T& obj = function_returning_T_ref<T>();
// do various other things...
return &obj[key];
}
我想使下标操作可配置,以便用户可以应用自己的代码将obj
和key
映射到返回值。像这样:
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>
或类似的相同效果而无需额外开销?
答案 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
对象或普通函数指针。