gpt4 book ai didi

c++ - 创建仅接受引用或指针的可变参数

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:19:22 26 4
gpt4 key购买 nike

我可以创建一个只接受指针的可变参数模板:

template<typename ... Types>
void F(Types *... args);

或者一个只接受引用的可变参数模板:

template<typename ... Types>
void F(Types &... args);

如何创建接受非常量引用或指针的模板?
例如

int a, b, c;
F(a, &b); // => F<int &, int *>
F(a, 3); // Error, 3 not pointer and cannot bind to non const-reference

注意:引用版本可能看起来没问题,因为它可以绑定(bind)到指针引用,但事实并非如此,因为它不会绑定(bind)到 int * const

最佳答案

我们可以写一个 trait 来检查类型是指针还是非常量引用:

template <typename T>
using is_pointer_or_ref =
std::integral_constant<bool, std::is_pointer<T>::value ||
(std::is_lvalue_reference<T>::value &&
!std::is_const<typename std::remove_reference<T>::type>::value)>;

然后我们可以使用 Jonathan Wakely's and_ 编写特征来检查参数包:

template<typename... Conds>
struct and_
: std::true_type
{ };

template<typename Cond, typename... Conds>
struct and_<Cond, Conds...>
: std::conditional<Cond::value, and_<Conds...>, std::false_type>::type
{ };

template <typename... Ts>
using are_pointer_or_ref = and_<is_pointer_or_ref<Ts>...>;

现在我们可以使用 std::enable_if 来验证类型:

template<typename ... Types, 
typename std::enable_if<are_pointer_or_ref<Types...>::value>::type* = nullptr>
void F(Types&&... args){}

请注意,转发引用对于检测参数的值类别是必需的,这样引用检查才能正常工作。

Live Demo

关于c++ - 创建仅接受引用或指针的可变参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32267516/

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