5

是否有,或者您将如何编写一个测试类是否兼容的元函数类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。

4

2 回答 2

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
}
于 2013-08-23T06:23:32.817 回答
0

你的意思是enable_if

如果您可以说服 Boost 概念检查与它一起有效地工作(而不是现在使用的宏 + 编译错误),ForwardConceptRange已经提供了类似的检查。

否则,改用现有的BOOST_CONCEPT_ASSERT宏会不会有问题?

于 2013-08-20T14:54:49.567 回答