C++ noexcept 未知成员函数
C++ noexcept unknown member function
#include<iostream>
#include<utility>
using namespace std;
struct A
{
void set(const int &){}
void set(int &&) noexcept
{}
};
template<class Assign,class T,class Func>
struct B
{
B& operator=(const Assign &)
{
return *this;
}
B& operator=(Assign &&) noexcept(noexcept(declval<T>().set(declval<Assign>())))
{
return *this;
}
};
int main()
{
cout<<is_nothrow_assignable<B<int,A,void(A::*)(int &&)>&,int&&>::value<<endl;
}
我要排队
B& operator=(Assign &&) noexcept(noexcept(declval<T>().set(declval<Assign>())))
到
B& operator=(Assign &&) noexcept(noexcept(declval<T>().Func(declval<Assign>())))
(但出现编译错误。)
这样用户就可以指定应该使用哪个成员函数。
在不知道应该提前调用哪个成员函数的情况下,有没有可能做到这一点?
如果您使用另一个参数来指定函数,它会起作用。
template<class Assign,class T,class Func, Func f> struct B
//...
B& operator=(Assign &&) noexcept(noexcept((declval<T>().*f)(declval<Assign>())))
//...
cout<<is_nothrow_assignable<B<int,A,void(A::*)(int &&), &A::set>&,int&&>::value<<endl;
在B
中添加一个Func
非类型参数,在noexcept
运算符中使用成员函数指针调用语法,然后可以通过传递指针来指定函数它。
完整代码 here, 如果需要更多上下文。
#include<iostream>
#include<utility>
using namespace std;
struct A
{
void set(const int &){}
void set(int &&) noexcept
{}
};
template<class Assign,class T,class Func>
struct B
{
B& operator=(const Assign &)
{
return *this;
}
B& operator=(Assign &&) noexcept(noexcept(declval<T>().set(declval<Assign>())))
{
return *this;
}
};
int main()
{
cout<<is_nothrow_assignable<B<int,A,void(A::*)(int &&)>&,int&&>::value<<endl;
}
我要排队
B& operator=(Assign &&) noexcept(noexcept(declval<T>().set(declval<Assign>())))
到
B& operator=(Assign &&) noexcept(noexcept(declval<T>().Func(declval<Assign>())))
(但出现编译错误。)
这样用户就可以指定应该使用哪个成员函数。
在不知道应该提前调用哪个成员函数的情况下,有没有可能做到这一点?
如果您使用另一个参数来指定函数,它会起作用。
template<class Assign,class T,class Func, Func f> struct B
//...
B& operator=(Assign &&) noexcept(noexcept((declval<T>().*f)(declval<Assign>())))
//...
cout<<is_nothrow_assignable<B<int,A,void(A::*)(int &&), &A::set>&,int&&>::value<<endl;
在B
中添加一个Func
非类型参数,在noexcept
运算符中使用成员函数指针调用语法,然后可以通过传递指针来指定函数它。
完整代码 here, 如果需要更多上下文。