我正在为 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<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 ...
我的问题是我想将这个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()};
}
当您的查询需要参数时,事情会变得更加有趣,因为您可能需要将适当的参数传递给您的查询。如果是这样,您需要提出合适的参数以用于 decltype(...)
.由于您可能需要在此上下文中不可用的变量,因此您可能会使用 std::declval<T>()
代替 T
类型的参数,例如 std::declval<int&>()
对于非 const
的论点int
类型的变量通过了。但是,我没有使用过您所指的库,也就是说,我不知道实际需要什么,也不知道将返回类型用作成员是否有意义。
关于c++ - 如何使类成员变量与函数模板的返回类型相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51922905/