Rodrigo Gurgel
Rodrigo Gurgel

Reputation: 1736

How to breakpoint multiple C++ template methods, just like non templates?

If I do:

(gdb) b nmspace::TestClass::compareFOO

Then the following methods signatures will be signed as a break point:

nmspace::TestClass::compareFOO(blah::Foo const&, blah::Foo const&, unsigned int)
nmspace::TestClass::compareFOO(blah::Foo const&, blah::FooField const&, unsigned int)
nmspace::TestClass::compareFOO(blah::FooField const&, blah::Foo const&, unsigned int)
nmspace::TestClass::compareFOO(blah::FooField const&, blah::FooField const&, unsigned int)

Is there something similar to the following or we must write the four everytime for template methods? Isn't polymorphism also applied to C++ templates?

nmspace::TestClass::compareFOOES<blah::Foo, blah::Foo>
nmspace::TestClass::compareFOOES<blah::Foo, blah::FooField>
nmspace::TestClass::compareFOOES<blah::FooField, blah::Foo>
nmspace::TestClass::compareFOOES<blah::FooField, blah::FooField>

I've tried nmspace::TestClass::compareFOOES, nmspace::TestClass::compareFOOES*, nmspace::TestClass::compareFOOES<>(), etc.

Upvotes: 1

Views: 114

Answers (1)

BigBoss
BigBoss

Reputation: 6914

if body of all of the function is same you may write a global function that can accept multiple type of parameters using std::enable_if or boost::enable_if:

template< class T >
struct is_valid_field
    : boost::or_<boost::is_same<T, blah::Foo>, boost::is_same<T, blah::FooField>>
{
};

template< class T, class Q >
nmspace::TestClass::compareFOO(T const&, Q const&, unsigned int,
    typename boost::enable_if<
        boost::and_<is_valid_field<T>, is_valid_field<Q>
    >::type* = 0)
{
    // implementation
}

Upvotes: 1

Related Questions