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

标签 c++ templates

我正在为 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/

相关文章:

C++:声明指针

c++ - 如何显式地将某些模板化输入作为参数?

c++ - 成员模板和继承

c++ - 静态数据成员的C++类内初始化

c++ - 为什么对模板化基类的函数调用不起作用?

c++ - 在 C++ 中用枚举类型包装 C-API

带有箭头符号的 C++ 模板自动返回类型需要 decltype?

c++ - 使用 any_of 找到的值在 lambda 外部的返回中使用

c++ - 添加基于模板参数的拷贝构造函数

c++ - Armadillo SpMat<int> 与 Mat<int> 相比非常慢