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

C++ 在有效和无效类型之间进行选择,c++,c++11,C++,C++11,如果我们有一个像std::conditional这样的模板元函数,我们可以基于布尔编译时条件“选择”类型。例如: template < bool CONDITION, typename T, typename U > struct conditional; template < typename T, typename U > struct conditional < true, T, U > { using type = T; }; templ

如果我们有一个像
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;

因为在
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;
};
模板
结构发送器\u选择器
{
使用type=void(*)(T&,Args&…);
};
模板
结构发送器\u选择器
{
使用type=void(T::*)(Args&…);
};
模板
结构发送器类型
{
使用类型=
类型名称发送者\选择者::类型;
};
用法:

sender_type<MySender, Arg1, Arg2, Arg3>::type
sender\u type::type
这是
void(MySender::*)(Arg1&,Arg2&,Arg3&)
如果
MySender
是类类型,或者是
void(*)(发送方&,Arg1&,Arg2&,Arg3&)


(您可能还希望允许工会。)

感谢您的快速响应。这正是我需要的。只有一个问题:变量包不是必须在模板的末尾吗?@Manu343726如果它正是您需要的,也许您应该接受Is作为答案?我只是在等待他对我的评论的回答。很抱歉
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