我正在为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"))));
Run Code Online (Sandbox Code Playgroud)
storage从函数返回的对象的类型很长,如下所示:
sqlite_orm::internal::storage_t<sqlite_orm::internal::table_t<Feed::MyClass, sqlite_orm::internal::column_t<Feed::MyClass, int, int const& (Feed::MyClass::*)() const, void (Feed::MyClass::*)(int), sqlite_orm::constraints::autoincrement ...
Run Code Online (Sandbox Code Playgroud)
我的问题是我想将此storage对象用作另一个类的成员变量.我如何告诉客户端类函数的返回类型make_storage?
您可以使用它decltype(expr)来确定表达式的类型.为了合理地掌握这种类型,我将查询打包到带有auto结果的函数中,并使用它来获取成员的类型,然后实际执行查询:
template <typename... Args>
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()};
}
Run Code Online (Sandbox Code Playgroud)
当您的查询需要参数时,事情会变得更有趣,因为您可能需要将适当的参数传递给查询.如果是这样,你需要提出合适的参数来使用decltype(...).由于您可能需要在此上下文中不可用的变量,您可能会使用std::declval<T>()代替类型的参数T,例如,std::declval<int&>()对于传递非const变量类型的参数int.但是,我没有使用你所指的库,即我不知道实际需要什么,或者使用返回类型作为成员是否有意义.