用于测试对象是否与提升范围兼容的元函数
Metafunction to test whether object is compatible with boost range
是否有一个元函数类,或者你会如何编写一个元函数类来测试一个类是否与boost::range
兼容?我想使用boost::enable
成语,例如
template <typename T>
Constructor::Constructor(const T& t, __attribute__((unused)) typename boost::enable_if<is_range_compatible<T> >::type* aux=NULL)
以获得适当的is_range_compatible
元函数。我知道pretty_print is_container,它捕获了很多案例,但不是所有适用于boost::range
.
编辑 这是使用 C++03,所以我无法访问 C++11 功能。我使用的是旧的 gcc 4.1 和 boost 1.51。
你是说enable_if
吗?
如果你能说服 Boost 概念检查有效地使用它(而不是它现在使用的宏 + 编译错误(,那么已经提供了像ForwardConceptRange
这样的检查。
否则,改用现有的BOOST_CONCEPT_ASSERT
宏是否有问题?
如果你升级到 Boost 1.54,有一个不错的库叫做 TTI。它允许您随意组合类型特征内省元函数,以便您可以轻松地剥离自己的元谓词,这些元谓词可用于启用或禁用函数模板。虽然这是一个很好的元编程练习,但我不建议在生产代码中这样做。我发现很难捕捉到STL容器实现细节产生的"漏报"。例如,MSVC11 附带的关联容器从基类继承其begin
和end
成员函数,基类通过 BOOST_TTI_HAS_MEMBER_FUNCTION
生成的元谓词产生误报。尽管有他的绰号,但无用给了你一个很好的建议:使用 Boost.Range 附带的概念来拒绝或接受函数模板主体中的类型,例如示例中的构造函数......当然,这不会解决您Constructor
的可兑换性问题......
编辑:示例,取自 vex:
#include <boost/tti/has_member_function.hpp>
#include <vector>
#include <map>
namespace tti_test {
BOOST_TTI_HAS_MEMBER_FUNCTION(begin);
// .. begin test class for mstest
// this succeeds in both variants
TEST_METHOD(has_const_member_function_begin_is_true_for_vector)
{
Assert::IsTrue(has_member_function_begin<
std::vector<int>::const_iterator (std::vector<int>::*)() const
>::value);
Assert::IsTrue(has_member_function_begin<
const std::vector<int>, std::vector<int>::const_iterator
>::value);
}
// this fails in both variants...
TEST_METHOD(has_const_member_function_begin_is_true_for_map)
{
Assert::IsTrue(has_member_function_begin<
std::map<int, int>::const_iterator (std::map<int, int>::*)() const
>::value);
Assert::IsTrue(has_member_function_begin<
const std::map<int, int>, std::map<int, int>::const_iterator
>::value);
}
// end test class for mstest
}
相关文章:
- 是否可以依赖函数范围的静态变量来执行程序关闭期间调用的方法?
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- 在 gcc/clang (C++) 中获取函数范围之外的标签地址
- 函数范围的静态变量如何导致与共享库中函数代码的未来使用不兼容
- 是否未定义将对函数范围变量的引用作为值返回
- 为什么当我的代码超出函数范围时,"does not name a type"出现编译器错误?
- 在函数范围之外的标头中使用 UDL
- 模板化函数范围内的条件模板化类型别名
- 获取提升程序选项以在函数范围之后保留
- C++ 链表 - 插入节点函数不会更新函数范围之外的值
- C++:将参数应用于函数范围
- 为什么基于指针交换两个值在函数范围之外不起作用?
- 类模板中定义的朋友函数范围定义的范围是什么?
- 在内联程序集中使用函数范围的标签
- 检测函数范围之外的未使用变量
- 静态变量生存期、文件范围与函数范围
- 是否可以编写一个在函数范围内使用时会抱怨的宏
- Arduino-setup()中声明的变量不在函数范围内
- C++-函数范围内的函数声明
- 我是否要删除函数范围内的内存?