我正在将第三方C ++库用于sqlite orm。
该库具有一个返回模板对象的函数。对象的类型是一个很长的模板,取决于模板等。这就是为什么提供的示例始终使用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
的返回类型?
答案 0 :(得分:5)
您可以使用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
变量被传递。但是,我没有使用过您所引用的库,即我不知道实际需要什么,或者使用返回类型作为成员是否有意义。
答案 1 :(得分:1)
我如何告诉客户端类函数的返回类型 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"))));