Travis Vitek wrote:
Martin Sebor wrote:
Eric Lemings wrote:
For compile-time tests, would it be preferable to use a
static assertion
or continue using good ol' rw_assert() even for compile-time
checks?  In
the former case, the test will fail to build and, in the latter case,
the compile-time check will not be easily distinguisable from other
runtime assertions.
I would recommend against using one component of the library
(static_assert) to test another.

The approach taken by existing tests is to verify types and
signatures by using them in ways that would make the tests
ill-formed if they didn't match the requirements, causing
a compiler error. You can see examples of this approach in
the 23.vector.cons.cpp test that was just mentioned.


I happen to use this trick ..

  typedef char assert_0 [(cond) ? 1 : -1];

I think we're talking about two different things. I assumed
Brad was asking about tests to check things like the expected
signatures of functions, such as the signature of std::get()
below:

    std::tuple<int> t;
    std::get<0>(t);

My approach to writing a test for this would be along these
lines:

#include <cassert>
#include <cstddef>
#include <tuple>

template <std::size_t N, class Tuple, class ExpectSig>
void check_get_signature ()
{
    ExpectSig* const sig = &std::get<N, Tuple>;
    _RWSTD_UNUSED (sig);
}

void test_get_signatures ()
{
#define TEST(N, Tuple, RetT) \
    check_get_signature<N, Tuple, RetT (const std::tuple<int>&)>()

    TEST (0, std::tuple<int>, const int&);
    TEST (1, std::tuple<int, char*>, char*&);
    ...
}

Martin

Reply via email to