我想引用内置运算符的函数指针,但我不知道如何指定特定的类型重载。
我有以下模板类签名:
template<typename ParamsType, typename FnCompareType>
class MyAction
{
public:
MyAction(ParamsType& arg0, ParamsType& arg1, FnCompareType& fnCpmpare)
: arg0_(arg0), arg1_(arg1), fnCompare_(fnCpmpare) {}
bool operator()()
{
if((*fnCompare_)(arg0_,arg1_)
{
// do this
}
else
{
// do s.th. else
}
}
private:
ParamsType& arg0_;
ParamsType& arg1_;
FnCompareType& fnCompare_;
}
想要使用这样的语法:
void doConditional(int param1, int param2)
{
MyAction<int,&::operator>=> action(param1,param2);
if(action())
{
// Do this
}
else
{
// Do that
}
}
但那不能编译:
error: ‘::operator>=’ has not been declared
我可以做些什么来引用这种内在的静态操作?
答案 0 :(得分:22)
本子条款中规定了表示第5章中定义的内置运算符的候选运算符函数。这些候选函数参与运算符重载决策过程,如13.3.1.2 中所述,并且不用于其他用途。
内置运算符(内置类型的运算符)不是真正的运算符函数。所以你不能有指向它们的函数指针。您也无法使用operator<(A,B)
语法调用它们。
它们只参与重载解析,但编译器会将它们直接转换为适当的asm / machine指令,而不需要任何“函数调用”。
user1034749 has already answered这个问题,但为了完整性:
该标准在§20.8,[function.objects] 中定义了许多功能对象,即
函数对象是函数对象类型的对象。在人们期望将指向函数的指针传递给算法模板的地方(第25条),接口被指定为接受函数对象。这不仅使算法模板与函数指针一起使用,而且使它们能够使用任意函数对象。
- equal_to
- not_equal_to
- 更大,更少
- greater_equal
- less_equal
这些是模板化的函数对象,它们在operator()
函数中衰减为类比运算符。它们可以用作函数指针参数。
user1034749是对的,我想陈述:没有别的办法,这些与'原始'函数指针完全等效。参考给出。
您可以使用标准库运算符作为函数指针(以“实际函数”形式出现)。
但是你必须引用模板的相应实例。编译器需要适当的提示来推导出正确的模板。
这适用于使用operator+
std::basic_string
的MSVC 2012
template<class Test>
Test test_function (Test const &a, Test const &b, Test (*FPtr)(Test const &, Test const &))
{
return FPtr(a, b);
}
int main(int argc, char* argv[])
{
typedef std::char_traits<char> traits_t;
typedef std::allocator<char> alloc_t;
std::basic_string<char, traits_t, alloc_t> a("test"), b("test2");
std::cout << test_function<std::basic_string<char, traits_t, alloc_t>>(a, b, &std::operator+) << std::endl;
return 0;
}
如果遗漏了test_function
的模板参数,那么这将失败(至少对于MSVC 2012)。
答案 1 :(得分:9)
您可以使用与C ++标准库中使用的解决方案相同的解决方案:
std::sort (numbers, numbers+5, std::greater<int>());
其中更大的是
template <class T> struct greater : binary_function <T,T,bool> {
bool operator() (const T& x, const T& y) const {return x>y;}
};
在您的情况下http://www.cplusplus.com/reference/functional/greater_equal/
关于建成运营商的参考。
您可以参考现有运营商&lt;任何课程(当然,如果他们不是私人,受保护或您的班级/功能不是朋友)。 但是操作员&lt;对于内置类型(bool,short,int,double),它不可能被引用。 事件,如果不看C ++标准,你可以从我上面的文字中看到。