C++ 如何绑定模板函数

C++ 如何绑定模板函数,c++,boost,C++,Boost,大家好,你们这些助推大师 我想在字符串向量中找到某个元素,忽略大小写: #include <iostream> #include <string> #include <vector> #include "boost/algorithm/string.hpp" #include "boost/bind.hpp" using std::string; using std::vector; bool icmp(const string& str1, co

大家好,你们这些助推大师

我想在字符串向量中找到某个元素,忽略大小写:

#include <iostream>
#include <string>
#include <vector>
#include "boost/algorithm/string.hpp"
#include "boost/bind.hpp"

using std::string;
using std::vector;

bool icmp(const string& str1, const string& str2)
{
    return boost::iequals(str1, str2);
}

int main(int argc, char* argv[])
{
    vector<string> vec;
    vec.push_back("test");

//  if (std::find_if(vec.begin(), vec.end(), boost::bind(&boost::iequals<string,string>, "TEST", _1)) != vec.end()) <-- does not compile
    if (std::find_if(vec.begin(), vec.end(), boost::bind(&icmp, "TEST", _1)) != vec.end())
        std::cout << "found" << std::endl;

    return 0;
}
#包括
#包括
#包括
#包括“boost/algorithm/string.hpp”
#包括“boost/bind.hpp”
使用std::string;
使用std::vector;
bool icmp(常量字符串和str1、常量字符串和str2)
{
返回升压::iequals(str1、str2);
}
int main(int argc,char*argv[])
{
向量向量机;
向量推回(“测试”);

//如果(std::find_if(vec.begin(),vec.end(),boost::bind(&boost::iequals,“TEST”,_1))=vec.end())我肯定这不是您所希望的,但这似乎是我能解决的唯一修复方法(使用g++c++03模式):

typedef bool(*fptr)(常量std::string&,常量std::string&);
if(std::find_if(vec.begin(),vec.end(),
boost::bind((fptr)和boost::iequals,“TEST”,_1)
)!=vec.end())

添加模板参数和默认语言环境参数在我的机器上有效

if (std::find_if(vec.begin(), vec.end(), boost::bind(&boost::iequals<string,string>, "TEST", _1, std::locale())) != vec.end())
        std::cout << "found" << std::endl;
if(std::find_if(vec.begin()、vec.end()、boost::bind(&boost::iequals,“TEST”、_1、std::locale())!=vec.end()
std::cout使用boost lambda:)

#包括
#包括
#包括
#包括
#包括
使用名称空间std;
使用名称空间boost::lambda;
int main()
{
向量向量机;
向量推回(“测试”);
向量推回(“测试”);
向量::迭代器;
它=find_if(vec.begin(),vec.end(),_1==“test”);

好极了!获取重载函数的函数指针是一个反复出现的问题——这很微妙,因为在调用站点上不明显存在歧义。这是个坏主意。这会从
bool(*)(const std::string&,const std::string&,const std::locale&)
转换到
bool(*)(const std::string&,const std::string&)
。需要一些模板魔术来处理第三个可默认参数。仔细想想,我不认为模板魔术可以使用默认参数。因此,可能唯一的选择是将第三个参数提供为@mkaes,或者切换到支持C++11 lambda的语言。抱歉,进行编辑。我在编辑时遇到了麻烦ing..如果有人能做到..那太好了。您失去了对
boost::iequals
的调用,这与
操作符==
不同!
if (std::find_if(vec.begin(), vec.end(), boost::bind(&boost::iequals<string,string>, "TEST", _1, std::locale())) != vec.end())
        std::cout << "found" << std::endl;
#include <iostream>
#include <boost/lambda/bind.hpp>
#include <boost/lambda/lambda.hpp>
#include <algorithm>
#include <vector>
using namespace std;
using namespace boost::lambda;

int main()
{
    vector<string> vec;
    vec.push_back("TEST");
    vec.push_back("test");

    vector<string>::iterator it;

    it = find_if(vec.begin(),vec.end(),_1 == "test");
    cout << *it << endl;

    return 0;
}