gpt4 book ai didi

c++ - 模板转发对成员方法的调用

转载 作者:行者123 更新时间:2023-11-30 03:40:17 24 4
gpt4 key购买 nike

考虑以下几点:

template <typename type> class my_wrapper
{
type _;

template <typename... types, typename std :: enable_if <has_my_method_callable_with_the_following_types <type, types...> :: value> :: type * = nullptr> void my_method(types... items)
{
_.my_method(items...);
}
};

如您所想,has_my_method_callable_with_the_following_types 在哪里?是某种 SFINAE 结构,它允许我确定是否 type有一个可以用这些类型调用的方法。

如您所见,上面的示例基本上将所有调用转发给了my_method。下降到 _ .出色地。 几乎所有这些。如果我这样做会发生什么:

class my_type
{
void my_method(int & x)
{
x++;
}
};

my_wrapper <my_type> my_wrapped;

int x;
my_wrapped.my_method(x);

显然上面的方法行不通,因为 x将通过复制传递给函数 while my_type :: my_method通过引用接受它。所以我想知道:有没有办法解决这个问题?我当然可以:

template <typename... types, typename std :: enable_if <has_my_method_callable_with_the_following_types <type, types & ...> :: value> :: type * = nullptr> void my_method(types & ... items)
{
_.my_method(items...);
}

但是对称地,当我通过时会遇到问题,比如说,int我无法引用但某些人完全可以接受的文字 my_type :: my_method(int x) .

我该如何解决这个问题?我想将所有调用无缝转接到 my_wrapper <type> :: my_methodtype :: my_method .

盗版注意:我不能使用继承,所以请不要建议! :)

最佳答案

正是引入完美转发和转发引用的目的:

template <
typename... types,
typename std :: enable_if <has_my_method_callable_with_the_following_types <type, types...> :: value> :: type * = nullptr
> void my_method(types&&... items)
{
_.my_method(std::forward<types>(items)...);
}

这是如何工作的:

在推导 T 时,语言中有一条特殊规则。在T&&构造,用于推导的参数是类型为 U 的左值, 然后 T推导为 U&而不是 U .

最终效果是,当参数是转发引用时( T&& 推导 T ),它要么是左值引用(如果参数是左值),要么是右值引用(如果参数是一个右值)。 std::forward<T>然后会根据需要将其转换回左值或右值。

关于c++ - 模板转发对成员方法的调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38141938/

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