如何在不使用 C++ 中的实例的情况下获取已删除引用的元组类型

How to get a removed-reference tuple type without using an instance in C++

我写了一个测试函数输出的测试框架(见下面的代码)。

    template <class FuncTy, class... IndexType>
    typename std::enable_if<std::tuple_size<typename function_helper<FuncTy>::arguments>::value == sizeof...(IndexType)
        and std::is_same_v<typename function_helper<FuncTy>::return_type, AnswerTy>
        and not is_member_function_pointer_v<FuncTy>, void>::type
        test(FuncTy func, IndexType... arg_indexes) {
        using function_args_tuple = typename function_helper<FuncTy>::arguments;
        using function_return_type = typename function_helper<FuncTy>::return_type;
  
        // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        function_args_tuple params;  /// error is here
        // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

        /// .....
    }

它适用于参数中没有引用的函数。

例如:

  1. 对于函数int f(int x, vector<int> y);(即参数列表中没有引用),params的类型是std::tuple<int, vector<int>>,所以params可以用代码正常实例化以上,
  2. 但对于像 int f(int& x, vector<int>& y); 这样的函数(即参数列表中的一个或多个引用),params 的类型变为 std::tuple<int&, vector<int>&>,无法用上面的代码实例化.

元组的类型params受函数参数列表的影响(用另一个函数完成),元组的类型未定义,所以我不能像this and this那样做,因为两个链接中的两个解决方案都显式使用 make_tuple 和实例化的元组对象。

所以我的问题是如何在不实例化元组的情况下删除引用。 (例如,将 tuple<int&, vector<int>&> 变为 tuple<int, vector<int>>)。

否则,如果有一些方法可以在元组的模板参数列表中使用引用来实例化元组,而无需硬编码 make_tuple 调用。

您可以通过模板偏特化获取 tuple 的元素类型,并将 std::decay 应用于这些类型以删除引用,类似这样

#include <type_traits>
#include <tuple>

template<class Tuple>
struct decay_args_tuple;

template<class... Args>
struct decay_args_tuple<std::tuple<Args...>> {
  using type = std::tuple<std::decay_t<Args>...>;
};

然后你可以通过助手class

得到一个tuple的衰减参数类型
decay_args_tuple<decltype(function_args_tuple)>::type params;

请注意,参数类型仍然需要是默认可构造的。