推论成员函数参数 /返回类型
Deduce member function arguments / return type
我有以下代码:
template <class... Args>
struct TypeList
{
static constexpr size_t size = sizeof...(Args);
template <std::size_t N>
using type = typename std::tuple_element<N, std::tuple<Args...>>::type;
};
struct Generator
{
std::tuple<float, float> process(float, int, size_t)
{
return std::make_tuple(0.0f, 1.0f);
}
};
是否有任何方法可以推断出元组模板参数以及Generator::process
的输入参数,以构造具有以下模板参数的类。
struct Node<GenType, ReturnTypesList, ArgumentTypeList>
其中 ReturnTypesList
包含返回元组的模板参数,而 ArgumentTypeList
包含该过程函数的变异参数类型。假定所有过程功能都会返回元组。
我没有得到您想要的,但可能对您有用的东西:
#include <type_traits>
#include <tuple>
template <class... Args>
struct TypeList
{
static constexpr size_t size = sizeof...(Args);
template <std::size_t N>
using type = typename std::tuple_element<N, std::tuple<Args...>>::type;
};
struct Generator
{
std::tuple<float, float> process(float, int, size_t)
{
return std::make_tuple(0.0f, 1.0f);
}
};
template<typename GenType, typename ReturnTypesList, typename ArgumentTypeList>
struct Node {};
template<typename T>
struct S
{
template<typename... RArgs, typename... Args>
static auto gen(std::tuple<RArgs...>(T::*)(Args...)) -> Node<T, TypeList<RArgs...>, TypeList<Args...>>;
};
template<typename T>
using NodeType = decltype(S<T>::gen(&T::process));
int main()
{
static_assert(std::is_same<NodeType<Generator>, Node<Generator, TypeList<float, float>, TypeList<float, int, size_t>>>::value, "!");
}
NodeType
是一旦专门使用特定发电机的必需类型,正如您可以从main
中的测试中看到的。
在具体情况下:
Node<Generator, TypeList<float, float>, TypeList<float, int, size_t>>
不要介意是否作为函数参数提供了成员而不是模板参数。无论如何,整个过程都是在编译时解决的。
作为旁注,该解决方案对那些过载process
的发电机不起作用。
#include <tuple>
template <class...>
struct Node;
struct Generator {
std::tuple<float, float> process(float, int, size_t);
};
template <class... Args1, class ClassType, class... Args2>
auto foo(std::tuple<Args1...> (ClassType::*)(Args2...)) -> Node<ClassType, Args1..., Args2...>;
int main() {
// T is Node<Generator, float, float, float, int, size_t>
using T = decltype(foo(&Generator::process));
return 0;
}
Args1
和 Args2
是正确推导的,因为将推导出模板参数列表末尾的包装扩展。传递给foo
的成员函数指针包含所有必要类型。foo
的所有模板参数将分别推导,然后组合到一定调整后匹配&Generator::process
类型的类型。链接
无关:如果未添加进程以返回std::tuple
,我们仍然可以使用模板模板参数,又称template <class...> class TT
根据@martin Bonner提供的信息进行编辑
template <class...>
struct Node {};
template <class...>
struct TypeList {};
struct Generator {
std::tuple<float, float> process(float, int, size_t) {}
};
template <class... ReturnArgs, class GeneratorType, class... Args>
auto magic(std::tuple<ReturnArgs...> (GeneratorType::*arg)(Args...))
-> Node<GeneratorType, TypeList<ReturnArgs...>, TypeList<Args...> > {
using ReturnType =
Node<GeneratorType, TypeList<ReturnArgs...>, TypeList<Args...> >;
return ReturnType{};
}
int main() {
magic(&Generator::process);
return 0;
}
相关文章:
- 函数作为模板参数,是否对返回类型强制约束
- 在 c++ 中将函数返回类型指定为模板参数
- C++方法是否可以根据传递给构造函数的参数具有不同的返回类型?
- 基于类型作为参数的字符串表示形式具有不同返回类型的函数
- 具有"templated"返回类型和参数的函数指针
- 如何创建两个具有相同名称和不同返回类型并基于布尔参数运行的函数
- 使用constexpr + auto作为返回和参数类型的奇怪类型推导
- 通过引用传递参数;函数返回类型是否必须为 VOID?
- 有没有办法根据 lambda 参数返回类型部分专用化我的模板化函数?
- 如何定义依赖于参数包转换的函数的返回类型
- 无法推断返回类型的模板参数
- C++模板;作为模板参数传递的函数的自动推导返回类型
- 如何在模板参数中分离函数类型返回类型和参数
- 为什么函数返回类型中不允许参数推导?
- 模板化函数以从输入参数推断返回类型 stl-container
- 将 2D 数组作为函数参数,并返回 2D 数组作为函数的返回类型
- C++ 如何将参数绑定到具有相同返回类型的函数,并将它们全部存储在一个容器中
- 为什么编译器不能从返回类型中推断出模板参数?
- 具有不同模板参数的函数返回类型
- C++:返回类型为 T 的模板函数不带 T 类型参数,将无法编译