说我目前有这样的模板功能:
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)
我想使下标操作可配置,以便用户可以应用自己的代码来映射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);
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,对于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];
}
};
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对象或普通函数指针。
| 归档时间: |
|
| 查看次数: |
279 次 |
| 最近记录: |