元功能测试物体是否与增压范围兼容

时间:2013-08-20 14:25:17

标签: c++ templates boost typetraits 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,并使用1.51。

2 个答案:

答案 0 :(得分:0)

您的意思是enable_if吗?

如果你可以说服Boost概念检查对它有用(而不是它现在使用的宏+编译错误),那么ForwardConceptRange之类的检查就是already provided

否则,使用现有的BOOST_CONCEPT_ASSERT宏是否有问题?

答案 1 :(得分:0)

如果你升级到Boost 1.54,有一个很好的名为TTI的库。它允许您随意组合类型特征内省元函数,以便您可以轻松地分离出您自己的元谓词,这些元谓词可用于启用或禁用函数模板。虽然这是一个很好的元编程练习,但我不建议在生产代码中这样做。我发现很难发现STL容器的实现细节引起的“漏报”。例如,随MSVC11一起提供的关联容器从基类继承其beginend成员函数,这会产生假阴性,并通过BOOST_TTI_HAS_MEMBER_FUNCTION生成元谓词。尽管有他的昵称,Useless给了你一个很好的建议:使用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
}