【发布时间】:2018-07-08 11:45:25
【问题描述】:
我正在尝试检查(成员)函数是否对其函数参数具有默认分配。但我似乎找不到能提供这些信息的类型特征。 (类似于std::has_default_assignment)。
我正在尝试做的演示(非功能性)。
struct TypeA {
void process(int a, int b) const {};
};
struct TypeB {
void process(int a, int b = 0) const {};
};
template<typename T, typename A1, typename A2>
using MemFcn = void(T::*)(A1, A2) const;
#include <type_traits>
template<typename T, typename A1, typename A2>
typename std::enable_if<std::has_default_assignment<A2>::value>::type
TestProcess(MemFcn<T, A1, A2> fcn) {
fcn(1);
};
template<typename T, typename A1, typename A2>
typename std::enable_if<!std::has_default_assignment<A2>::value>::type
TestProcess(MemFcn<T, A1, A2> fcn) {
fcn(1, 2);
};
template<typename T>
void TestConcepts(T)
{
TestProcess(&T::process);
}
int main(void) {
// Should call TypeA::process(1,2);
TestConcepts(TypeA{});
// Should call TypeB::process(1)
TestConcepts(TypeB{});
return 0;
}
如何检测函数参数是否具有默认赋值?
【问题讨论】:
-
如果您不关心重载,请检查函数是否适合两个不同的参数计数。
-
@user6556709 编译时间怎么做?
-
函数指针不能有默认参数,因此一旦您尝试将指针传递给函数,信息就会丢失。你需要稍微改变你的方法。当您拥有
TestConcepts中的类型时,您可以例如 SFINAE 使用不同数量的参数调用成员函数process以查看它是否成功。
标签: c++ typetraits enable-if