gpt4 book ai didi

c++ - 在有效类型和无效类型之间进行选择

转载 作者:太空狗 更新时间:2023-10-29 19:58:49 25 4
gpt4 key购买 nike

如果我们有像 std::conditional 这样的模板元函数,我们可以根据 bool 编译时条件“选择”类型。例如:

template < bool CONDITION, typename T, typename U >
struct conditional;

template < typename T, typename U >
struct conditional < true, T, U >
{
using type = T;
};

template < typename T, typename U >
struct conditional < false, T, U >
{
using type = U;
};

const bool whats_big = sizeof( int ) > sizeof( double );

using bigger_type = typename conditional<whats_big , int , double>::type;

我的问题是:有什么方法可以在有效类型和无效类型之间进行选择吗?

我目前正在实现一个事件类。事件有一个发送者参数和可变数量的事件参数:

template<typename SENDER , typename... ARGS>
class event;

因此类型为 void(SENDER& , ARGS&...) 的函数可以用作事件处理程序。在这种情况下,调用处理程序传递对引发事件的对象的引用(通过发送者参数)。
另一方面,我想要一种允许发送者成员函数成为事件处理程序的方法,换句话说,类型为 void(SENDER::*)(ARGS&...) 的函数。

问题是我不能用这样的句子:

 using handler_type = typename conditional<std::is_class<SENDER>::value,void(SENDER::*)(ARGS&...) , void(SENDER& , ARGS&...)>::type;

因为在 SENDER 不是类类型的情况下,第一个类型是无效的(使用指向非类类型成员的指针)。

最佳答案

您可以使用额外的间接级别来实现:

template <bool, typename T, typename ...Args>
struct sender_chooser
{
using type = void(*)(T &, Args &...);
};

template <typename T, typename ...Args>
struct sender_chooser<true, T, Args...>
{
using type = void (T::*)(Args &...);
};

template <typename T, typename ...Args>
struct sender_type
{
using type =
typename sender_chooser<std::is_class<T>::value, T, Args...>::type;
};

用法:

sender_type<MySender, Arg1, Arg2, Arg3>::type

如果 MySender 是类类型,则为 void (MySender::*)(Arg1 &, Arg2 &, Arg3 &),否则为 void (*)(Sender &, Arg1 &, Arg2 &, Arg3 &).

(您可能还想允许 union 。)

关于c++ - 在有效类型和无效类型之间进行选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17504860/

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