std :: function参数类型

时间:2015-11-04 09:56:27

标签: c++ c++14

如果您选中here,则会发现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提供的任何其他功能不感兴趣。

2 个答案:

答案 0 :(得分:2)

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

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;
}

答案 1 :(得分:1)

至少在Visual C ++上,继承是他们如何做到的:

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

_Fun_class_base可以有条件地从unary_functionbinary_function继承或非 - 如果没有参数或者有超过2个参数。

unary_functionbinary_function类型 - 定义了所需类型。

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