gpt4 book ai didi

c++ - 检测字段或成员getter是否为主键的技术

转载 作者:行者123 更新时间:2023-11-28 02:37:39 26 4
gpt4 key购买 nike

我正在对算法进行优化。

优化在于当已知结构中的字段值 是唯一的时立即停止搜索。要明白这一点,想象一下我的结构就像一个数据库表,具有唯一值的字段相当于关系数据库中的“主键”。

如果我知道该字段的值是唯一的,我想分派(dispatch)到一个在发现第一次出现值时急切停止的实现。我在编译时设计就知道这一点。

所以我想检测给定的字段值在编译时是否是唯一的。

我的函数如下所示:

template <class Storage, class Getter, class Value>
vector<MyStruct> select_records(Storage const & s, Getter g, Value const & v);

这个函数将调度:

  • 如果作为数据成员指针的 Getter 是“主键”,那么它将分派(dispatch)给优化的实现。
  • 否则,分派(dispatch)到遍历所有存储的实现。

如何实现“主键”检测?约束:解决方案必须是非侵入性的。

最佳答案

根据您提供的信息,无法在编译时执行您想要的操作。 Getter只是一种类型,你说单靠类型无法识别主键。这意味着您不是基于 Getter(类型)进行识别,而是基于 g,这是一个运行时值。当然没有对运行时值的编译时访问。

如果可能,您可以通过将 g 转换为编译时信息来实现此目的,如下所示:

template <class Storage, class Value, Value Storage::*getter>
vector<MyStruct> select_records(Storage const & s, Value const & v);

然后将其特化为对应于主键的 getter 的已知值。


当然,上面的代码要求您显式指定所有模板参数(因为您要这样指定的参数 getter 是最后一个),而且效果并不好,因为函数模板不能部分特化。这里有一些东西提供了更好的语法和特化选项:

template <class Storage, class Value>
Selector<Storage, Value> record_selector(Storage const & s, Value const & v)
{
return Selector<Storage, Value>(s, v);
}


template <class Storage, class Value>
class Selector
{
Storage const & s;
Value const & v;

public:
Selector(Storage const & s, Value const & v) : s(s), v(v) {}

template <Value Storage::*getter>
vector<MyStruct> select()
{
return Select_Impl<Storage, Value, getter, IsPrimaryKey<Storage, Value, getter>::value>::call(s, v);
}
};


template <class Storage, class Value, Value Storage::*getter, bool primary>
struct Select_Impl
{
static vector<MyStruct> call(Storage const & s, Value const & v)
{
// Normal implementation.
}
};


template <class Storage, class Value, Value Storage::*getter>
struct Select_Impl<Storage, Value, getter, true>
{
static vector<MyStruct> call(Storage const & s, Value const & v)
{
// Optimised implementation
}
};


template <class Storage, class Value, Value Storage::*getter>
struct IsPrimaryKey
{
static const bool value = false;
};
// Specialise the above for each primary key with `value` set to `true`
// This should be possible, since you said you know the set of primary keys at compile-time

在代码中,您应该能够像这样使用它:

vector<MyStruct> res = record_selector(s, v).select<&SomeStorage::someMember>();

关于c++ - 检测字段或成员getter是否为主键的技术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26968095/

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