Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否可以获取内置标准运算符的函数指针?_C++_Operators - Fatal编程技术网

C++ 是否可以获取内置标准运算符的函数指针?

C++ 是否可以获取内置标准运算符的函数指针?,c++,operators,C++,Operators,我想引用内置运算符的函数指针,但我不知道如何指定特定的类型重载 我有以下模板类签名: template<typename ParamsType, typename FnCompareType> class MyAction { public: MyAction(ParamsType& arg0, ParamsType& arg1, FnCompareType& fnCpmpare) : arg0_(arg0), arg1_(arg1), fn

我想引用内置运算符的函数指针,但我不知道如何指定特定的类型重载

我有以下模板类签名:

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_;
}

<>我能做些什么来引用这些内在的静态操作?

你可以使用与C++标准库中使用的相同的解决方案:

std::sort (numbers, numbers+5, std::greater<int>());
std::sort(数字,数字+5,std::greater());
哪里更大

template <class T> struct greater : binary_function <T,T,bool> {
    bool operator() (const T& x, const T& y) const {return x>y;}
};
模板结构更大:二进制函数{
布尔运算符()(常量T&x,常量T&y)常量{return x>y;}
};
就你而言

关于内置运算符的参考

您可以为任何类引用现有操作符<(当然,如果它们不是私有的、受保护的或您的类/函数不是朋友)。 但是,对于内置类型(bool、short、int、double),它不可能作为参考。 事件如果不看C++标准,你可以从上面的文本中看到。 为什么不能有它们的函数指针: C++11,§13.6/1,[over.builded] 本款规定了代表第5条中定义的内置运算符的候选运算符函数。这些候选功能参与13.3.1.2中所述的操作员过载解决过程,且不用于其他目的


内置运算符(用于内置类型的运算符)不是真正的运算符函数。所以你不能让函数指针指向它们。您也不能使用
operatorxx调用它们!已经找到了如何使用这个。很抱歉,如果可以引用这些运算符函数,我编辑了我的问题以获得一般答案。@g-makulik标准库提供了封装大多数内置运算符的命名函数。@g-makulik我想我不明白您要找的是哪种“一般答案”。您可以通过标准库给出的名称来引用“运算符函数”。@MonadNewb:我知道。但它们与“原始”函数指针有点不同,不是吗?这些结构具有适当的
运算符()
定义,您需要一个实例来调用它们。在C++11中,您可以使用lambda函数,而无需使用opeator()定义新结构(
ACTION\u P1(MyAction,fnCompare){…}
这是否编译?返回类型和参数类型在哪里?@MonadNewb是的,是的!真正的定义更为复杂。通过模板参数列表延迟操作参数的类型。感谢您删除googlemock的详细信息,以使您的问题更清楚。为了将来的参考,当你做这样的简化来获得你的问题的核心问题时,你应该做一个例子,用纯OL+C++编译,这样别人就可以复制和粘贴代码并按照原样编译它。@ MonadNewb,我认为Pixel化化学家的回答相当适合这个话题的一个规范问题的答案。为了使这个问题成为一个规范的问题,应该改变什么,或者是否已经有了s。类似的问题?是的,像素化学家给出了一个非常彻底和完整的答案。在我看来,您应该修改示例代码,使其能够在不依赖任何第三方库的情况下编译。从我阅读代码的方式来看,
ACTION\u P1
应该是一个函数名。但是,我没有看到返回类型。而且它的参数只有名称,没有类型。这看起来很像这个问题的标准答案!
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;}
};
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;
}