std::函数参数类型

std::function argument types

本文关键字:类型 参数 函数 std      更新时间:2023-10-16

如果你在这里检查,你会发现std::function应该定义一些可选类型,为了方便起见:

Member types
Type                  Definition
result_type           R
argument_type         T if sizeof...(Args)==1 and T is the first and only type in Args...
first_argument_type   T1 if sizeof...(Args)==2 and T1 is the first of the two types in Args...
second_argument_type  T2 if sizeof...(Args)==2 and T2 is the second of the two types in Args...

如何实现这一要求?我的第一个想法是有条件地继承一个定义两种可能情况的类型的结构,但有没有其他更好的方法,不涉及继承?我对类型擦除或std::function提供的任何其他功能不感兴趣。

如何根据模板参数专门化数据结构:

template <typename...Args>
struct test
{
};
template <typename Arg1, typename Arg2>
struct test<Arg1, Arg2> //specialization for sizeof...(Args)==2
{
    using first_argument_type = Arg1;
    using second_argument_type = Arg2;
};
template <typename Arg1>
struct test<Arg1> //specialization for sizeof...(Args)==1
{
    using argument_type = Arg1;
};

int main()
{
    //test<int, char, std::string>::argument_type t31;          //NOK
    //test<int, char, std::string>::first_argument_type t32;    //NOK
    //test<int, char, std::string>::second_argument_type t33;   //NOK
    //test<int, char>::argument_type t21;                       //NOK
    test<int, char>::first_argument_type t22;                   //OK
    test<int, char>::second_argument_type t23;                  //OK
    test<int>::argument_type t11;                               //OK
    //test<int>::first_argument_type t11;                       //NOK
    //test<int>::second_argument_type t11;                      //NOK
    return 0;
}

至少在Visual C++上,继承是他们的工作方式:

std::function继承自_Get_function_impl
_Get_function_impl类型将_Func_class<_Ret, _Types...>定义为type
_Func_class继承自_Fun_class_base

如果没有参数或参数超过2个,则_Fun_class_base可以条件继承自unary_functionbinary_function或非。

CCD_ 13和CCD_。

所以是的。。继承是微软团队选择的方式,我不明白为什么不呢?