Неизбежные вариационные шаблоны в GCC (используются с CUDA)? - PullRequest
3 голосов
/ 19 июля 2011

Я пробовал некоторый код CUDA / Thrust в Linux / GCC и хотел использовать некоторые библиотеки TR1, когда заметил нечто странное: большинство библиотек неизменно извлекают tr1_impl/type_traits (4.4) или просто type_traits (4.6) и этот заголовок всегда будет содержать шаблоны с переменным числом, например, так:

  template<typename _Res, typename... _ArgTypes>
    struct is_function<_Res(_ArgTypes...)>
    : public true_type { };

Однако эти заголовки также используются, когда я запускаю GCC в режиме C ++ 98 или C ++ 03! Как это может работать?

Фактическая проблема, с которой я столкнулся, состоит в том, что набор инструментов CUDA не распознает конструкции C ++ 0x, и cudafe++ (интерфейс CUDA, т.е. программа, которая разделяет объединенный исходный код на исходный код хоста и устройства) прерывается с ошибкой при обнаружении параметра шаблона variadic.

Итак ... как GCC может поддерживать и полагаться на вариационные шаблоны в не-0x диалектах C ++? И есть ли способ получить подлинную C ++ 03 версию TR1?

1 Ответ

3 голосов
/ 19 июля 2011

Welp, реализация не обязательна для предоставления заголовков.Требуется, чтобы #include <stuff> делал правильные вещи.Таким образом, это означает, что , если реализация решает использовать заголовки для этой функциональности, необязательно, чтобы эти заголовки соответствовали C ++.И на самом деле GCC уже довольно давно поддерживает шаблоны с переменными числами в качестве расширения.

Кроме того, я не могу не заметить

#pragma GCC system header

в заголовке <tr1/random>, который вы упоминаете. GCC будет обрабатывать файл специально , а, например, не сообщать об ошибках предупреждений в нем.Я бы подумал, что использование расширения в соответствующем режиме может быть легко превращено в ошибку, поэтому я не уверен, что происходит, но по крайней мере юридически это вариант.

Существует также специальный статус TR1, которыйне являются обязательными.Насколько я могу судить о реализации, единственный заголовок C ++ 03, который включает <type_traits>, это <functional>, и он правильно делает это только в режиме C ++ 0x (то есть в остальное время это допустимый C ++ 03файл с помощью предварительной обработки, в отличие от <tr1/random>).(Я не проверял другие случаи, хотя.)

...