如何否定 mem_fn 创建的函数指针的结果
How to negate the result of a function pointer created by mem_fn
我有一个更复杂的包装器版本 class,它封装了如下所示的用户类型 std::vector。
struct UserType1Encapsulator
{
template <typename F>
UserType1Encapsulator& Filter( F filterFunction )
{
std::vector<userType1> newList;
for ( size_t i = 0; i < iTerrainList.size(); i++) --> can't use range for loop vs2010
{
if ( filterFunction(iTerrainList[i]) )
newList.push_back(iTerrainList[i]);
}
encapsulatedList = newList;
return *this;
}
std::vector<userType1> encapsulatedList;
}
我正在做一些链接的事情,比如 Filter.Filter.Map 等。
一切都很好,直到我发现我需要取消对我传递的函数指针的操作,如
userVec.Filter( std::mem_fn(&userType1::isCopy) );
我需要使用
userVec.Filter( std::not1( std::mem_fn(&userType1::isCopy)) );
但我不确定如何使用它,不幸的是我无法访问 lamdbas,因为即使我正在使用 GCC 4.8 进行编译,现在代码也应该使用 vs2010 进行编译。
否定 std::mem_fn 结果的正确方法是什么,哪个将在 vs2010 中编译?
当您没有 lambda 时,请记住它们只是可调用对象的语法糖。创建您自己的通用否定可调用对象:
template <typename TFunction>
struct negator
{
// `_f` will be your mem_fn
TFunction _f;
negator(TFunction f) : _f(f) { }
bool operator()(/* same arguments as isCopy */) const
{
return !f(/* same arguments as isCopy */);
}
};
template <typename TFunction>
negator<TFunction> make_negator(TFunction f)
{
return negator<TFunction>(f);
}
然后您应该可以按如下方式使用它:
userVec.Filter( make_negator( std::mem_fn(&userType1::isCopy)) );
我有一个更复杂的包装器版本 class,它封装了如下所示的用户类型 std::vector。
struct UserType1Encapsulator
{
template <typename F>
UserType1Encapsulator& Filter( F filterFunction )
{
std::vector<userType1> newList;
for ( size_t i = 0; i < iTerrainList.size(); i++) --> can't use range for loop vs2010
{
if ( filterFunction(iTerrainList[i]) )
newList.push_back(iTerrainList[i]);
}
encapsulatedList = newList;
return *this;
}
std::vector<userType1> encapsulatedList;
}
我正在做一些链接的事情,比如 Filter.Filter.Map 等。
一切都很好,直到我发现我需要取消对我传递的函数指针的操作,如
userVec.Filter( std::mem_fn(&userType1::isCopy) );
我需要使用
userVec.Filter( std::not1( std::mem_fn(&userType1::isCopy)) );
但我不确定如何使用它,不幸的是我无法访问 lamdbas,因为即使我正在使用 GCC 4.8 进行编译,现在代码也应该使用 vs2010 进行编译。
否定 std::mem_fn 结果的正确方法是什么,哪个将在 vs2010 中编译?
当您没有 lambda 时,请记住它们只是可调用对象的语法糖。创建您自己的通用否定可调用对象:
template <typename TFunction>
struct negator
{
// `_f` will be your mem_fn
TFunction _f;
negator(TFunction f) : _f(f) { }
bool operator()(/* same arguments as isCopy */) const
{
return !f(/* same arguments as isCopy */);
}
};
template <typename TFunction>
negator<TFunction> make_negator(TFunction f)
{
return negator<TFunction>(f);
}
然后您应该可以按如下方式使用它:
userVec.Filter( make_negator( std::mem_fn(&userType1::isCopy)) );