[英]How to make a class member variable be the same type of return of a function template?
我正在为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&>()
传递int
类型的非const
变量的参数。 但是,我没有使用过您所引用的库,即,我不知道实际需要什么,也不知道使用return类型作为成员是否有意义。
我如何告诉客户端类make_storage函数的返回类型?
只是问编译器!
暂时将变量/数据属性声明为您知道返回类型不是(并且没有任何转换)的东西。
错误消息将报告它找不到所请求分配的转换。
如果g ++描述令人困惑,请尝试使用clang ++进行相同的编译。
// auto - temporarily try int or some other type
int storage = make_storage("db.sqlite",
make_table("users",
// the rest of it ....
make_column("name",
&UserType::name,
default_value("name_placeholder"))));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.