gpt4 book ai didi

c++ - 从函数参数推断模板类型

转载 作者:太空狗 更新时间:2023-10-29 21:32:13 26 4
gpt4 key购买 nike

我不确定问题的标题,但基本上我很好奇如何创建一个类似访问者的函数,该函数可以对正确使用类型推断的集合上的某些类型进行操作。

例如,集合包含从单个基类 (Base) 继承的对象。一些操作仅适用于特定的子类(例如,FooBar 继承自 Base)。

一个实现可以是

template<class T, class F>
void visit(F f)
{
for (auto c : the_collection) {
if (auto t = dynamic_cast<T*>(c)) {
f(t);
}
}
}

这里的问题是调用这样的函数需要指定类类型 FooBar两次:

visit<FooBar>([](FooBar* f) { f->some_method(); });

我想使用类型推断,所以我可以写 visit([](FooBar* f) ... , 但无法设法获得正确的模板。

例如:

template<class T>
using Visitor = std::function<void(T*)>;
template<class T>
void visit(const Visitor<T>& f)
{
for (auto c : the_collection)
if (auto t = dynamic_cast<T*>(c))
f(t);
}

visit<FooBar>([](FooBar*) ... 一起工作但不是 visit([](FooBar*) ... .

no matching overloaded function found

void visit(const std::function<void(T *)> &)': could not deduce template argument for 'const std::function<void(T *)> &' from '{....}::<lambda_2c65d4ec74cfd95c8691dac5ede9644d>

是否可以定义一个模板以这种方式推断类型,或者语言规范不允许这样做?

最佳答案

您标记了 C++17,因此您可以使用 std::function 的推导指南。

那么下面的事情呢?

template <typename>
struct first_arg_type;

template <typename R, typename T0, typename ... Ts>
struct first_arg_type<std::function<R(T0, Ts...)>>
{ using type = T0; };

template <typename F>
void visit (F const & f)
{
using T = typename first_arg_type<decltype(std::function{f})>::type;

for (auto c : the_collection)
if (auto t = dynamic_cast<T>(c))
f(t);
}

请注意,您可以在 std::function 中使用标准类型 first_argument_type 而不是自定义类型特征 first_arg_type,所以

   using T = typename decltype(std::function{f})::first_argument_type;

不幸的是,std::function::first_argument_type 从 C++17 开始被弃用,并将从 C++20 中删除。

关于c++ - 从函数参数推断模板类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55810126/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com