Вы можете делать то, что вы хотите, но не так, как вы пытаетесь это сделать!Вы можете использовать std::enable_if
вместе с std::is_base_of
:
#include <iostream>
#include <utility>
#include <type_traits>
struct Bar { virtual ~Bar() {} };
struct Foo: Bar {};
struct Faz {};
template <typename T>
typename std::enable_if<std::is_base_of<Bar, T>::value>::type
foo(char const* type, T) {
std::cout << type << " is derived from Bar\n";
}
template <typename T>
typename std::enable_if<!std::is_base_of<Bar, T>::value>::type
foo(char const* type, T) {
std::cout << type << " is NOT derived from Bar\n";
}
int main()
{
foo("Foo", Foo());
foo("Faz", Faz());
}
Поскольку этот материал становится все более распространенным, люди обсуждали наличие какого-то static if
, но до сих пор оно не появилось.
Оба std::enable_if
и std::is_base_of
(объявленные в <type_traits>
) являются новыми в C ++ 2011.Если вам нужно скомпилировать компилятор C ++ 2003, вы можете использовать их реализацию из Boost (вам нужно изменить пространство имен на boost
и включить "boost/utility.hpp"
и "boost/enable_if.hpp"
вместо соответствующихстандартные заголовки).В качестве альтернативы, если вы не можете использовать Boost, оба эти шаблона класса могут быть реализованы довольно легко.