我有一个普通的二进制运算符的概念
template<typename Op, typename T> concept is_binary_operation =
requires (const T& t1, const T& t2) // e.g. a+b
{
{Op()(t1,t2)}->std::convertible_to<T>;
};
和复合赋值运算符的概念
template<typename Op, typename T> concept is_operation_and_assign =
requires (T& t1, const T& t2) // e.g a += b;
{
{Op()(t1,t2)}->std::convertible_to<T>;
};
对于复合赋值运算符,这可以按预期工作:
template<typename T> struct op_and_assign
{
T& operator()(T& t1, const T& t2)
{
t1 += t2;
return t1;
}
};
此“ is_operation_and_assign”,但不是“ is_binary_operation”
std::cout << is_binary_operation<op_and_assign<double>, double> << " ";
std::cout << is_operation_and_assign<op_and_assign<double>, double> << std::endl;
打印“ 0 1”。但是,std :: plus满足两个概念:
std::cout << is_binary_operation<std::plus<double>, double> << " ";
std::cout << is_operation_and_assign<std::plus<double>, double> << std::endl;
打印“ 1 1”。
如何更改概念“ is_operation_and_assign”,以便获得输出“ 1 0”,即,它将由op_and_assign而不是std :: plus满足?