Условная компиляция с использованием свойств типа Boost

У меня есть шаблон, который я бы хотел условно скомпилировать в зависимости от типа аргумента. Меня интересует только различие между "Обычными старыми данными" (POD), т.е. Целыми числами и т.д. Или классами/структурами. Я использую С++ VS2008 в Windows.

template<T>
class foo
{
    void bar(T do_something){
    #if IS_POD<T>
        do something for simple types
    #else
        do something for classes/structs
    #endif
}}

Я смотрю на библиотеку boost, и я вижу, что у них, похоже, есть то, что я хочу. Однако я не понимаю, какой будет правильный синтаксис для оператора #if.

Любая помощь будет оценена.


Изменить --- Прочитав ответы, я вижу, что в своем определении вопроса я забыл что-то. Класс foo - это шаблонный класс, для которого требуется только экземпляр версии bar, которая верна для class type T. Я искал решение, которое может быть разрешено во время компиляции. Надеюсь, это очистит мою проблему.

Ответы

Ответ 1

Вы можете сделать это без enable_if, потому что все, что вам нужно, - это отправка в зависимости от типа. enable_if используется для добавления/удаления экземпляров шаблонов в/из разрешения перегрузки. Вы можете использовать функции вызова, чтобы выбрать лучший метод передачи объектов в вашу функцию. Как правило, объекты должны передаваться по ссылке, тогда как POD передается по значению. call_traits позволяет выбирать между const и неконстантными ссылками. В приведенном ниже коде используется ссылка const.

#include <boost/type_traits.hpp>
#include <boost/call_traits.hpp>

template <typename T>
class foo {
public:
    void bar(typename boost::call_traits<T>::param_type obj) {
        do_something(obj, boost::is_pod<T>());
    }
private:
    void do_something(T obj, const boost::true_type&)
    {
      // do something for POD
    }
    void do_something(const T& obj, const boost::false_type&)
    {
      // do something for classes
    }
};

Ответ 2

Вы не можете решить это с помощью препроцессора, поскольку он не знает о С++. (Это инструмент для замены немого текста.) Используйте шаблоны для этого.

Предполагая, что IsPod<T>::result возвращает что-то похожее Boolean<true>/Boolean<false>:

template<T>
class foo
{
    void do_something(T obj, Boolean<true> /*is_pod*/)
    {
      // do something for simple types
    }
    void do_something(T obj, Boolean<false> /*is_pod*/)
    {
      // do something for classes/structs
    }

    void bar(T obj)
    {
       do_something(obj, IsPod<T>::result());
    }
}

Ответ 3

Использование препроцессора здесь невозможно. Посмотрите Boost Enable Если вместо библиотеки.

В частности, в вашем случае это будет выглядеть (не проверено):

void bar (typename enable_if <is_pod <T>, T>::type do_something)
{
    // if is POD
}

void bar (typename disable_if <is_pod <T>, T>::type do_something)
{
    // if not
}