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