c++ - 无法从 'auto' 推断出 'tuple_cat'

标签 c++ variadic-templates option-type template-specialization c++17

基础问题

我要解决的基本问题是:

我有一个模板参数包 ArgTypes,我需要用包装在 std::optional 中的每个类型创建一个元组。例如:make_optional_tuple<int, double, std::string>应该返回 std::tuple<std::optional<int>, std::optional<double>, std::optional<std::string>> 类型元组的元组元组中的每个元素都初始化为 std::nullopt .

到目前为止我的工作

我正在使用 g++包含在 GCC 7.1 中。我已经研究 C++ 类型系统很长时间了,我的代码适用于一种类型,但不适用于多种类型。我在参数包中使用多种类型时遇到的错误是:

error: unable to deduce 'auto' from 'tuple_cat<std::make_tuple(_Elements&& ...) [with _Elements = {std::optional<int>&}](), optional_tuple>'

有谁知道我该如何解决这个问题?直觉上(尽管我可能不正确)我认为问题在于 C++ 类型系统无法推断出 auto optional_tuple 的类型。因为它涉及完全解析由参数包生成的不同函数模板的递归链——类型系统在尝试解析 auto 的类型时可能无法做到这一点。变量。

这是一个最小的工作示例:

#include <optional>
#include <tuple>

template<int n, typename ArgType, typename... ArgTypes>
struct make_optional_tuple_helper {
    static auto tuple() {
        std::optional<ArgType> optional_arg = {};
        auto optional_tuple = make_optional_tuple_helper<n-1, ArgTypes...>::tuple();
        return std::tuple_cat<std::make_tuple(optional_arg), optional_tuple>;
    }
};

template<typename ArgType>
struct make_optional_tuple_helper<1, ArgType> {
    static std::tuple<std::optional<ArgType>> tuple() {
        std::optional<ArgType> optional_arg = {};
        return std::make_tuple(optional_arg);
    }
};

template<typename... ArgTypes>
auto make_optional_tuple() {
    return make_optional_tuple_helper<std::tuple_size<std::tuple<ArgTypes...>>::value, ArgTypes...>::tuple();
};

int main() {
    auto i = make_optional_tuple<int>(); // works!
    auto j = make_optional_tuple<int, double>(); // error: unable to deduce 'auto'...
}

(用 g++-7 -std=c++1z example.cpp 编译)

感谢您的时间和/或帮助!

最佳答案

方式想得太多了:

template<typename... ArgTypes>
auto make_optional_tuple() {
    return std::tuple<std::optional<ArgTypes>...>{};
}

由于默认构造的可选项是 nullopt,这就是您所需要的。


您的具体问题是您使用了错误的括号:

return std::tuple_cat<std::make_tuple(optional_arg), optional_tuple>;
                    ~~~                                           ~~~

那些应该是括号。按原样,您返回的是指向格式错误的函数模板特化的指针,而不是元组。

关于c++ - 无法从 'auto' 推断出 'tuple_cat',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44710212/

相关文章:

c++ - 基本代码::积木问题

c++ - 统一2个空间内存

c++ - 使用 C++17 折叠表达式测试所有元素是否相等

c++ - 在 C++ 中迭代指向实例的指针数组所需的声明

Android:Vulkan 层已停止在设备上运行

c++ - 这种获取模板参数包中最后一个元素的方法是否有隐藏的开销?

swift - UUIDString 意外发现 nil

ios - swift 中的三元展开

ruby - 有没有更好的方法从 Ruby 中的 block 中获取值?