C++ 如何将运算符作为默认函子参数传递?

C++ 如何将运算符作为默认函子参数传递?,c++,templates,operators,default,functor,C++,Templates,Operators,Default,Functor,为了简单起见,假设我想实现一个函数,它接受两个参数,并对等式进行谓词测试 template<typename T, typename TCompare> bool Eq(const T& a, const T& b, const TCompare& cmp) { return cmp(a, b); } 因此,您基本上需要创建一个包装器,将std::equal_传递给或任何其他运算符等效的函子。出于某种原因,当您调用没有它的函数时,将它作为默认参数不会编译

为了简单起见,假设我想实现一个函数,它接受两个参数,并对等式进行谓词测试

template<typename T, typename TCompare>
bool Eq(const T& a, const T& b, const TCompare& cmp) {
  return cmp(a, b);
}

因此,您基本上需要创建一个包装器,将std::equal_传递给或任何其他运算符等效的函子。出于某种原因,当您调用没有它的函数时,将它作为默认参数不会编译。

您可以重载函数,不是吗

// Use the user-supplied TCompare.
template<typename T, typename TCompare> 
bool Eq(const T& a, const T& b, TCompare cmp) { 
  return cmp(a, b); 
} 

// Use op== for equality otherwise.
template<typename T> 
bool Eq(const T& a, const T& b) { 
  return a == b; 
} 
//使用用户提供的TCompare。
模板
布尔均衡(常数T&a、常数T&b、T比较cmp){
返回cmp(a,b);
} 
//否则,使用op==表示相等。
模板
布尔均衡(常数T&a,常数T&b){
返回a==b;
} 

如果代码使用三个参数调用
Eq()
,编译器将解析对第一个重载的调用。如果代码只使用两个参数调用
Eq()
,那么编译器将不得不解析为第二个重载。

std::equal\u to如何

我不认为下面这样的东西对你有用:

#include <functional>

template<typename T, typename TCompare = std::equal_to<T>>
class Math {
public:
    static bool Eq(const T& a, const T& b) {
        TCompare cmp;

        return cmp(a, b);
    }
};

int _tmain(int argc, _TCHAR* argv[]) {
    Math<int>::Eq(1,1);

    return 0;
}
#包括
模板
课堂数学{
公众:
静态布尔均衡(常数T&a、常数T&b){
比较化学机械抛光;
返回cmp(a,b);
}
};
int _tmain(int argc,_TCHAR*argv[]{
数学:等式(1,1);
返回0;
}

默认模板参数只允许在类模板上使用(或者至少MSVC 10是这么说的)

好的,对于这样的简单情况,这是可以接受的。但假设函数是1000线性函数。然后,这种方法需要复制和粘贴body函数,并用cmp替换operator==对吗?@leden:然后需要将函数分解为更小的函数。1000行对于单个函数来说太多了。将常用代码分解成它们自己的函数,然后让
Eq()
根据需要调用它们。我知道。这不是重点。我想说的是,如果你这样做,调用另一个函数,调用另一个函数,等等。你必须为每个被调用的函数创建两个版本,这意味着大量的代码重复。这就是我要寻找的。但我还是有点失望,因为我不能将is设置为默认参数。但是我设法找到了解决方案,所以我将更新原始帖子。我还没有尝试过,但我想知道您是否可以使用std::equal_to作为cmp的默认参数。你试过这个吗?这不起作用,因为显然无法从默认参数推断函子的类型。-如果您告诉类型(),它会起作用,但默认值的作用很小。-与其使用stl函子等于、小于等,不如使用您自己设计的函数指针?
#include <functional>

template<typename T, typename TCompare = std::equal_to<T>>
class Math {
public:
    static bool Eq(const T& a, const T& b) {
        TCompare cmp;

        return cmp(a, b);
    }
};

int _tmain(int argc, _TCHAR* argv[]) {
    Math<int>::Eq(1,1);

    return 0;
}