【发布时间】:2021-04-06 18:03:52
【问题描述】:
我正在尝试使用 C++20 概念实现递归版本std::invoke_result_t,以便可以检索嵌套调用结果的类型。
recursive_invoke_result_t的用例
auto f1 = [](int x) { return static_cast<double>(x); };
std::cout << typeid(recursive_invoke_result_t<decltype(f1), int>).name() << std::endl; // expected output "double"
std::cout << typeid(recursive_invoke_result_t<decltype(f1), std::vector<int>>).name() << std::endl; // expected output is something like "std::vector<double>"
std::cout << typeid(recursive_invoke_result_t<decltype(f1), std::vector<std::vector<int>>>).name() << std::endl; // expected output is something like "std::vector<std::vector<double>>"
auto f2 = [](int x) { return std::to_string(x); };
std::cout << typeid(recursive_invoke_result_t<decltype(f2), std::vector<int>>).name() << std::endl; // expected output is something like "std::vector<string>"
auto f3 = [](std::string x) { return std::atoi(x.c_str()); };
std::cout << typeid(recursive_invoke_result_t<decltype(f3), std::vector<std::string>>).name() << std::endl; // expected output is something like "std::vector<int>"
实验性实现
实验实现如下。
// recursive_invoke_result_t implementation
template<typename F, typename T>
requires (std::invocable<F, T>)
struct recursive_invoke_result_t_detail
{
using type = std::invoke_result_t<F, T>;
};
template <typename F, template <typename...> typename Container, typename... Ts>
requires (std::ranges::input_range<std::ranges::range_value_t<Container<Ts...>>>) && (!std::invocable<F, Container<Ts...>>)
struct recursive_invoke_result_t_detail<F, Container<Ts...>>
{
using type = Container<typename recursive_invoke_result_t_detail<F, std::iter_value_t<Container<Ts...>>>::type>;
};
template<typename F, typename T>
using recursive_invoke_result_t = typename recursive_invoke_result_t_detail<F, T>::type;
在上述实验实现中,测试用例recursive_invoke_result_t<decltype(f1), int> 似乎工作正常。第二个测试用例recursive_invoke_result_t<decltype(f1), std::vector<int>>,出现编译错误'recursive_invoke_result_t_detail': the associated constraints are not satisfied、'recursive_invoke_result_t' : Failed to specialize alias template和unable to recover from previous error(s); stopping compilation。有没有办法解决这个问题?请给我一些提示或例子。
【问题讨论】:
-
您能否更清楚地解释您要达到的目标?
标签: c++ templates recursion c++20 c++-concepts