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

时间:2018-08-20 00:39:39

标签: c++ templates

我正在将第三方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的返回类型?

2 个答案:

答案 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"))));