Условная компиляция для и без понятий?

Я играю с g++ концепции. Иногда я хочу скомпилировать с clang у которого пока нет концепций.

Как я могу скомпилировать concepts код с компилятором без концепции?

Я делаю этот трюк сейчас, чтобы #define сама концепция просто как class (или же typename) ключевое слово. (Я делаю это по книгам Степанова).

#if __cpp_concepts >= 201507
template <class T>
concept bool Integral = is_quantity<T>::value; //Full concepts syntax
#else
#define Integral typename //Stepanov trick
#endif

template<Integral I> I f(I i){return i + 1;}

int main(){f(2);}

Кажется, я могу оставить объявления нетронутыми (и без ограничения концепции, но код компилируется).

Это рекомендуемый способ решения этой проблемы.
Любые проблемы, которые могут появиться в будущем.

Сейчас у меня есть одна проблема: я не могу поместить определение понятия в пространство имен.
Другая проблема, которую я вижу, заключается в том, что регистр SFINAE может сломаться при компиляции без понятий.

Есть ли лучшие обходные пути?


Это иллюстрирует проблему со случаем пространств имен:

#if __cpp_concepts >= 201507
namespace demo{
template <class T>
concept bool Integral = is_quantity<T>::value;
}
#else
#define demoIntegral typename
#endif

Это заставляет меня ставить условия во всех объявлениях шаблонов.

template<
#if __cpp_concepts >= 201507
demo::Integral
#else
demoIntegral
#endif
I> I f(I i){return i + 1;}

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector