作者:素描淡写的快乐_855 | 来源:互联网 | 2022-12-07 11:55
我正在为sqlite orm使用第三方C++库.该库具有返回模板对象的函数.对象的类型是一个非常长的模板,它取决于数字表等.这就是提供的示例总是使用的原因auto
.这是一个例子:
auto storage = make_storage("db.sqlite",
make_table("users",
make_column("id", &User::id, autoincrement(), primary_key()),
make_column("first_name", &User::firstName),
make_column("last_name", &User::lastName),
make_column("birth_date", &User::birthDate),
make_column("image_url", &User::imageUrl),
make_column("type_id", &User::typeId)),
make_table("user_types",
make_column("id", &UserType::id, autoincrement(), primary_key()),
make_column("name", &UserType::name, default_value("name_placeholder"))));
storage
从函数返回的对象的类型很长,如下所示:
sqlite_orm::internal::storage_t
我的问题是我想将此storage
对象用作另一个类的成员变量.我如何告诉客户端类函数的返回类型make_storage
?
1> Dietmar Kühl..:
您可以使用它decltype(expr)
来确定表达式的类型.为了合理地掌握这种类型,我将查询打包到带有auto
结果的函数中,并使用它来获取成员的类型,然后实际执行查询:
template
auto make_storage_query() {
return make_storage("db.sqlite",
make_table("users",
make_column("id", &User::id, autoincrement(), primary_key()),
make_column("first_name", &User::firstName),
make_column("last_name", &User::lastName),
make_column("birth_date", &User::birthDate),
make_column("image_url", &User::imageUrl),
make_column("type_id", &User::typeId)),
make_table("user_types",
make_column("id", &UserType::id, autoincrement(), primary_key()),
make_column("name", &UserType::name, default_value("name_placeholder"))));
}
struct whatever {
decltype(make_storage_query()) member;
}
int main() {
whatever run{make_storage_query()};
}
当您的查询需要参数时,事情会变得更有趣,因为您可能需要将适当的参数传递给查询.如果是这样,你需要提出合适的参数来使用decltype(...)
.由于您可能需要在此上下文中不可用的变量,您可能会使用std::declval()
代替类型的参数T
,例如,std::declval()
对于传递非const
变量类型的参数int
.但是,我没有使用你所指的库,即我不知道实际需要什么,或者使用返回类型作为成员是否有意义.