У меня есть класс ModeSessions и 2 производных класса: ReadModeSessions и WriteModeSessions;ModeSessions имеет уникальный тип Mode;В Logic я собираю в контейнер каждую сессию с собственным уникальным типом.Но теперь я остановился на методе шаблона, чтобы вернуть правильный сеанс в данном режиме.
#include <QVector>
#include <QSharedPointer>
namespace states {
enum class Mode{ read1, read2, write1, write2};
constexpr bool modeIsReadType(Mode m){ return (m == Mode::read1 || m == Mode::read2)? true: false;}
constexpr bool modeIsWriteType(Mode m){ return (m == Mode::write1 || m == Mode::write2)? true: false;}
}
class ModeSession{
public:
states::Mode type;
};
using namespace states;
class ReadModeSession: public ModeSession{
public:
ReadModeSession(Mode m){ModeSession::type = m;}
};
class WriteModeSession : public ModeSession{
public:
WriteModeSession(Mode m){ModeSession::type = m;}
};
class Logic
{
public:
Logic(){
allModeSessions << QSharedPointer<ReadModeSession>(new ReadModeSession(Mode::read1));
allModeSessions << QSharedPointer<ReadModeSession>(new ReadModeSession(Mode::read2));
allModeSessions << QSharedPointer<WriteModeSession>(new WriteModeSession(Mode::write1));
allModeSessions << QSharedPointer<WriteModeSession>(new WriteModeSession(Mode::write2));
}
QVector<QSharedPointer<ModeSession>> allModeSessions;
template<class Tm> QSharedPointer<ReadModeSession>
getMs(Tm m, typename std::enable_if<states::modeIsReadType(m), Tm>::type){
for (QSharedPointer<ModeSession> ms: allModeSessions){
if (ms->type == m) return ms.dynamicCast<ReadModeSession>();
}
return nullptr;
}
template<class Tm> QSharedPointer<WriteModeSession>
getMs(Tm m, typename std::enable_if<states::modeIsWriteType(m), Tm>::type){ //to stack overflow....
for (QSharedPointer<ModeSession> ms: allModeSessions){
if (ms->type == m) return ms.dynamicCast<WriteModeSession>();
}
return nullptr;
}
};
оба метода шаблона имеют
In file included from ..\enableIf\logic.cpp:1:0:
..\enableIf\logic.h:35:74: error: template argument 1 is invalid
getMs(Tm m, typename std::enable_if<states::modeIsReadType(m), Tm>::type){
^
..\enableIf\logic.h:35:74: error: template argument 1 is invalid
..\enableIf\logic.h:35:74: error: template argument 1 is invalid
..\enableIf\logic.h:35:74: error: template argument 1 is invalid
..\enableIf\logic.h:35:35: error: invalid use of template-name 'std::enable_if' without an argument list
getMs(Tm m, typename std::enable_if<states::modeIsReadType(m), Tm>::type){
^
..\enableIf\logic.h:35:44: error: expected ',' or '...' before '<' token
getMs(Tm m, typename std::enable_if<states::modeIsReadType(m), Tm>::type){
^
..\enableIf\logic.h:42:75: error: template argument 1 is invalid
getMs(Tm m, typename std::enable_if<states::modeIsWriteType(m), Tm>::type){ //to stack overflow....
^
..\enableIf\logic.h:42:75: error: template argument 1 is invalid
..\enableIf\logic.h:42:75: error: template argument 1 is invalid
..\enableIf\logic.h:42:75: error: template argument 1 is invalid
..\enableIf\logic.h:42:35: error: invalid use of template-name 'std::enable_if' without an argument list
getMs(Tm m, typename std::enable_if<states::modeIsWriteType(m), Tm>::type){ //to stack overflow....
^
..\enableIf\logic.h:42:44: error: expected ',' or '...' before '<' token
getMs(Tm m, typename std::enable_if<states::modeIsWriteType(m), Tm>::type){ //to stack overflow....
Я не уверен, что делаю правильно, пытаясь поставитьмоя функция constexpr внутри, но, как я понимаю, должен быть аргумент bool, и примеры, за которыми я следую, имеют std :: base_of или std :: is_integer, которые используют bool в качестве возврата, так в чем же разница?
Я мог бы рассмотреть другойподходы, но суть в том, что мне нужно заботиться о сессиях, которые имеют некоторые общие методы и уникальные для каждого типа;(Может быть, использовать эти методы для реализации в другом новом классе sessionManager)