Как проверить, что какой-то шаблон * не * компилируется для заданных типов аргументов? - PullRequest
2 голосов
/ 13 мая 2009

Я пишу умный шаблон ptr, который предназначен для создания экземпляров только для данного базового класса и его подклассов, который обеспечивает неявные преобразования в варианты boost :: shared_ptr * MyPtr<U> шаблона MyPtr<T> имеет длинный поскольку преобразование допустимо из T * в U * (допустимый базовый класс и const-совместимый).

В vs2005 это работало нормально, но не с g ++ на linux, поэтому мой коллега изменил его там, но это нарушило правильность const.

Моя проблема в том, что я хочу провести модульное тестирование, что некоторые преобразования недопустимы (например, присвойте MyPtr<const T> значение MyPtr<T>), в результате чего файл не компилируется ! Но у вас не может быть файла, не компилируемого в решении ...

Если есть какая-то специфичная для VS #pragma или какая-то хитрость SFINAE, которая могла бы проверить данную конструкцию, НЕ допустима и поэтому не компилируется?

Спасибо, --DD

Ответы [ 2 ]

1 голос
/ 13 мая 2009

Вы можете запустить компилятор командной строки, cl, который довольно легко настроить, и перехватить его сообщение об ошибке.

Нет make-файла и почти никакой информации из решения / проекта. Просто включите путь и исходный файл. В самом простом вам просто нужна программа, которая "переворачивает" код завершения другой программы:

#include <sstream>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    std::ostringstream command;

    for (int n = 1; n < argc; n++)
        command << argv[n] << " ";

    return (system(command.str().c_str()) == EXIT_SUCCESS)
                ? EXIT_FAILURE : EXIT_SUCCESS;
}

Он просто восстанавливает переданные ему аргументы (опуская свое собственное имя) и выходит из полученной командной строки, а затем возвращает успех, если он терпит неудачу, и сбой, если он успешен. Этого достаточно, чтобы обмануть Visual Studio или make.

Технически восстановленная командная строка должна заключать аргументы в кавычки, но это будет необходимо, только если вы достаточно безумны, чтобы поместить пробелы в каталог сборки или имена исходных файлов!

0 голосов
/ 13 мая 2009

Если данный аргумент (в вашем случае 'const T') удовлетворяет всем другим модульным тестам, кроме того, который вы ищете, разве это не признак того, что это будет вполне приемлемый случай? Другими словами, если это работает, зачем это запрещать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...