是否有可能写出一个类型特征,比如说is_callable<T>一个对象是否已operator()定义?如果调用运算符的参数事先已知,则很容易,但在一般情况下则不行.当且仅当至少有一个重载调用运算符被定义时,我希望特征返回true.
这个问题是相关的,并且有一个很好的答案,但它不适用于所有类型(仅限于 - 可int转换类型).此外,std::is_function工作,但只适用于正确的C++函数,而不是函子.我正在寻找更通用的解决方案.
有了std::is_constructible一个可以质疑一定构造的存在某个给定类型:
struct A {};
struct B
{
explicit B(int, A, double) {}
};
int main()
{
std::cout<<std::is_constructible<B,int,A,double>::value<<std::endl; //prints true
}
Run Code Online (Sandbox Code Playgroud)
假设一个人不知道类型B.是否还有一种方法可以检查是否存在B包含类型的构造函数A,而不管其他参数是什么?( - 或者,已经足够了,其中包含A第n个位置的类型?)
给定一个非explicit构造函数,我通过使用一个可以隐式转换为任何东西的类型找到了一个解决方法:
struct convert_to_anything
{
template<typename T>
operator T() const
{
return T{};
}
};
int main()
{
std::cout<<std::is_constructible<B, convert_to_anything, A, convert_to_anything>::value<<std::endl;
}
Run Code Online (Sandbox Code Playgroud)
(实际上,并且对我来说意外,我发现它实际上在explicit添加到...的构造函数中似乎也能正常工作B...而我认为它会阻止转换?)
尽管如此,通过这种解决方法,我将不得不测试所有可能的参数数量.A在第一个位置说一个:
std::is_constructible<B, A>::value
|| std::is_constructible<B, A, convert_to_anything>::value
|| std::is_constructible<B, A, convert_to_anything, convert_to_anything>::value
//... and so on …Run Code Online (Sandbox Code Playgroud) 我试图理解下面的类模板是如何工作的(取自这里),但我无法理解它:
template <typename Type>
class has_member
{
class yes { char m;};
class no { yes m[2];};
struct BaseMixin
{
void operator()(){}
};
struct Base : public Type, public BaseMixin {};
template <typename T, T t> class Helper{};
template <typename U>
static no deduce(U*, Helper<void (BaseMixin::*)(), &U::operator()>* = 0);
static yes deduce(...);
public:
static const bool result = sizeof(yes) == sizeof(deduce((Base*)(0)));
};
Run Code Online (Sandbox Code Playgroud)
更具体地说,我不了解其中的目的BaseMixin和存在operator().而且,既然Base是源自它,我也不理解它.
更具体地说,当模板参数Type定义时operator(),为什么只有 SFINAE被触发,导致第一个deduce()函数被忽略而第二个函数被选中? …