如何非模板断点多个C ++模板方法?

时间:2012-12-21 19:02:13

标签: c++ debugging gdb

如果我这样做:

(gdb) b nmspace::TestClass::compareFOO

然后将以下方法签名作为断点签名:

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)

是否有类似于以下的内容,或者我们必须每次都为模板方法编写四个?多态性是否也适用于C ++模板?

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>

我已尝试nmspace::TestClass::compareFOOESnmspace::TestClass::compareFOOES*nmspace::TestClass::compareFOOES<>()等。

1 个答案:

答案 0 :(得分:1)

如果所有函数的主体相同,您可以编写一个可以使用std::enable_ifboost::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
}