繁体   English   中英

如何使类成员变量与函数模板的返回类型相同?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM