还检查继承函数的函数签名
Check for function signature also for inherited functions
我需要检查容器擦除函数 return 是否是迭代器。我通常会通过例如检查功能签名促进。但是在提升 class(例如 flat_set)的情况下,擦除是继承的,因此不会被检查发现。但我真的需要它。 SFINAE to check for inherited member functions 只显示了一个 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;
};
但由于擦除过载而失败。我可能需要 decltype 或类似的东西来检查编译时使用 const_iterator 擦除调用的 return 类型,但我找不到。
这在 C++11 之前的版本中如何实现?
如果有擦除功能,这也不起作用 returning void:
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;
};
以下作品:
/// "Stores a type"
template<typename T> struct Type2Type{
typedef T type;
};
/// Evil hackery to put an expression into a type
template<typename T>
Type2Type<T> operator,(T, Type2Type<void>);
template<typename T>
T declval();
template<class T>
struct EraseReturnsIterator
{
typedef typename T::iterator iterator;
typedef BOOST_TYPEOF_TPL((declval<T>().erase(declval<iterator>()), Type2Type<void>())) result;
static CONSTEXPR bool value = boost::is_same<iterator, typename result::type>::value;
};
基本上我们只是调用我们需要的 return 类型的函数。如果没有这种类型的函数 return 无效,那么 BOOST_TYPEOF_TPL 就已经可以工作了。不幸的是,删除 CAN return void 会破坏实现,因为它试图将 "void&" 传递到堆栈中的某处。
因此,为了避免无效(没有双关语意),我们将它放在一个类型中,该类型包含一个类型。为了能够对表达式执行此操作,我们重载了逗号运算符。这样结果等于 "Type2Type" 我们可以很容易地阅读。完成!
逗号重载的想法:
我需要检查容器擦除函数 return 是否是迭代器。我通常会通过例如检查功能签名促进。但是在提升 class(例如 flat_set)的情况下,擦除是继承的,因此不会被检查发现。但我真的需要它。 SFINAE to check for inherited member functions 只显示了一个 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;
};
但由于擦除过载而失败。我可能需要 decltype 或类似的东西来检查编译时使用 const_iterator 擦除调用的 return 类型,但我找不到。
这在 C++11 之前的版本中如何实现?
如果有擦除功能,这也不起作用 returning void:
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;
};
以下作品:
/// "Stores a type"
template<typename T> struct Type2Type{
typedef T type;
};
/// Evil hackery to put an expression into a type
template<typename T>
Type2Type<T> operator,(T, Type2Type<void>);
template<typename T>
T declval();
template<class T>
struct EraseReturnsIterator
{
typedef typename T::iterator iterator;
typedef BOOST_TYPEOF_TPL((declval<T>().erase(declval<iterator>()), Type2Type<void>())) result;
static CONSTEXPR bool value = boost::is_same<iterator, typename result::type>::value;
};
基本上我们只是调用我们需要的 return 类型的函数。如果没有这种类型的函数 return 无效,那么 BOOST_TYPEOF_TPL 就已经可以工作了。不幸的是,删除 CAN return void 会破坏实现,因为它试图将 "void&" 传递到堆栈中的某处。
因此,为了避免无效(没有双关语意),我们将它放在一个类型中,该类型包含一个类型。为了能够对表达式执行此操作,我们重载了逗号运算符。这样结果等于 "Type2Type" 我们可以很容易地阅读。完成!
逗号重载的想法: