【发布时间】:2013-07-07 02:03:58
【问题描述】:
如果我们有像std::conditional 这样的模板元函数,我们可以根据布尔编译时条件“选择”类型。例如:
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不是类类型的情况下,第一种类型无效(使用指向非类类型成员的指针)。
【问题讨论】: