Условная компиляция с использованием свойств типа 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
}