Как я могу скомпилировать следующий код?
Я пытаюсь проверить, существует ли BigStruct в типе, и включить f, если это так.
#include <type_traits>
struct A {
using BigStruct = int;
};
struct C {
};
template <typename T>
struct B {
void f(typename T::BigStruct t) requires requires {T::BigStruct;} {}
};
int main() {
B<A> b1;
B<C> b2;
}
Ошибка, которую я получил:
<source>:11:24: error: no type named 'BigStruct' in 'C'
void f(typename T::BigStruct t) requires requires {T::BigStruct;} {}
~~~~~~~~~~~~^~~~~~~~~
<source>:16:8: note: in instantiation of template class 'B<C>' requested here
B<C> b2;
^
1 error generated.
ASM generation compiler returned: 1
<source>:11:24: error: no type named 'BigStruct' in 'C'
void f(typename T::BigStruct t) requires requires {T::BigStruct;} {}
~~~~~~~~~~~~^~~~~~~~~
<source>:16:8: note: in instantiation of template class 'B<C>' requested here
B<C> b2;
^
1 error generated.
Execution build compiler returned: 1
Вот ссылка на godbolt для x86-64 clang trunk.
@ 463035818_is_not_a_number намеренно B является шаблоном класса.
@ 463035818_is_not_a_number: Разумно предположить, что B содержит другие вещи. MCVE минимальны, поэтому они не являются исходным кодом.
@NicolBolas абсолютно разумно. Что касается концепций, которые я новичок, вопрос был чисто любопытным.
Проверка понятий для функций, не являющихся шаблонами, происходит после создания подписи функции. Это означает, что список параметров должен существовать. И, следовательно, он должен быть синтаксически допустимым.
В этом случае вы мало что можете сделать, если не хотите ограничивать весь класс, кроме старой стратегии до C++20 превращения самой функции в шаблон:
template<typename U = T>
requires requires {typename U::BigStruct;}
void f(typename U::BigStruct t) {}
Есть ли польза от требований? Спрашиваю, потому что без godbolt.org/z/3nMne65Ee эффект тот же.
@ 463035818_is_not_a_number: Это делает более понятным требование. SFINAE — это своего рода хак.
Это специально, что B является шаблоном класса? Или, возможно, вы просто хотите, чтобы f был шаблоном функции?