#c 20
Вопрос:
Я переношу свой код с c 17 на c 20, и мне нужно использовать require вместо std::enable_if…
Как определить конструкторы классов в качестве прямого объявления с помощью c 20, в котором используется ключевое слово require в следующем примере ?
#include <type_traits>
class CChMyBaseClass {
};
template <
typename _ChClass,
typename _ChFunction>
class CChMyClass : public CChMyBaseClass {
private:
_ChFunction m_ChFunction;
public:
// how to do forward declaration ?
CChMyClass()
requires (std::is_member_function_pointer<_ChFunction>::value)
: CChMyBaseClass() {
}
// how to do forward declaration ?
CChMyClass()
requires (!std::is_member_function_pointer<_ChFunction>::value)
: CChMyBaseClass()
, m_ChFunction(
nullptr) {
}
};
class CChTestClass {
public:
void ChTest() {
}
};
void ChTest() {
}
int main() {
CChMyClass<CChTestClass, decltype(amp;CChTestClass::ChTest)> CChMyClass1();
CChMyClass<CChTestClass, decltype(amp;ChTest)> CChMyClass2();
return 0;
}
Комментарии:
1. Ты пробовал? Ваш компилятор отклонил его? Будет очень досадно, если в тот момент, когда вы получите ответ, вы ответите: «Произошла эта ошибка».
2. @StoryTeller-UnslanderMonica, спасибо за ваш комментарий. Г. Слипен уже ответил.
Ответ №1:
Это действительно не отличается от любого другого типа прямого объявления. Просто напиши:
template <typename _ChClass, typename _ChFunction>
class CChMyClass: public CChMyBaseClass {
...
CChMyClass() requires (std::is_member_function_pointer<_ChFunction>::value);
CChMyClass() requires (!std::is_member_function_pointer<_ChFunction>::value);
...
};
Я думаю, что сложность скорее в фактических определениях функций. Но даже это не так уж сложно, если подумать. Вам просто нужно снова включить template
параметры и requires
предложение:
template <typename _ChClass, typename _ChFunction>
CChMyClass<_ChClass, _ChFunction>::CChMyClass()
requires (std::is_member_function_pointer<_ChFunction>::value)
: CChMyBaseClass(), m_ChFunction(...) {
...
};
Обратите внимание, что в вашем примере вы не объявили два экземпляра CChMyClass
in main()
, а вместо этого объявили две функции, у CChMyClass
которых в качестве возвращаемого типа был a (это известно как самый неприятный синтаксический анализ). Просто опустите ()
в конце или используйте вместо этого фигурные скобки.
Комментарии:
1. Г. Слипен, спасибо за вашу помощь. В моем реальном коде моя ошибка заключалась в том, что я объявил конструкцию один раз, потому что, если бы я думал, что все одинаковы 🙂