Я играю с 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;}
Задача ещё не решена.
Других решений пока нет …