как сделать конструкторы классов шаблонов в качестве прямого объявления

#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. Г. Слипен, спасибо за вашу помощь. В моем реальном коде моя ошибка заключалась в том, что я объявил конструкцию один раз, потому что, если бы я думал, что все одинаковы 🙂