我需要检查容器的erase函数是否返回迭代器。通常我会通过boost等工具检查函数签名,但是对于boost类(例如flat_set),erase是继承而来的,因此无法通过检查找到。但我确实需要它。SFINAE用于检查继承的成员函数只展示了C++11的解决方案,而我目前无法使用它。
我尝试了以下代码:
我尝试了以下代码:
template <typename T>
class has_member_func_erase_it_constit
{
typedef typename T::iterator iterator;
typedef typename T::const_iterator const_iterator;
typedef BOOST_TYPEOF_TPL(&T::erase) eraseType;
typedef typename boost::function_types::result_type<eraseType>::type result;
public:
static const bool value = boost::is_same<iterator, result>::value;
};
template<class T>
struct EraseReturnsIterator
{
static CONSTEXPR bool value = has_member_func_erase_it_constit<T>::value;
};
但是它失败了,因为erase被重载了。我可能需要decltype或类似的东西来检查使用const_iterator时从编译时调用erase的返回类型,但我找不到。
在C++11之前,这怎么可能呢?
如果有一个返回void的erase函数,这也行不通:
template <typename T>
class has_member_func_erase_it
{
typedef typename T::iterator iterator;
typedef typename T::const_iterator const_iterator;
typedef char yes[1];
typedef char no [2];
static T makeT();
static iterator makeIt();
typedef BOOST_TYPEOF_TPL(makeT().erase(makeIt())) result;
public:
static const bool value = boost::is_same<iterator, result>::value;
};
erase
的方法。例如,vector
同时拥有erase(iterator)
和erase(iterator, iterator)
两种方法。 - Marshall Clow