如果您选中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
提供的任何其他功能不感兴趣。
答案 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_function
,binary_function
继承或非 - 如果没有参数或者有超过2个参数。
unary_function
和binary_function
类型 - 定义了所需类型。
所以是的..继承是微软团队选择的方式,我不明白为什么不呢?