c++ - std::enable_if - 如何使用自己的函数作为模板参数
问题描述
我有类 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 类中实现它)
解决方案
推荐阅读
- javascript - 如何在控制台中更新字符串而不是重复它
- javascript - Javascript (React) - 如何识别助手和实用程序,确保项目的正确可扩展性?
- mysql - 无法确定外键约束失败
- c++ - 使用 c++ stdlib 从管道非阻塞读取
- istio - 如何使用 istio-operator 更改 istiod 部署的配置?
- dialogflow-es - 如何提取用户在上一个意图中给出的特定值并在对话流中的下一个意图中使用它?
- django - 请为员工帐户输入正确的电子邮件地址和密码。两个地方都要注意大小写。django
- python - 如何解析特定表中的href?
- java - 无法在 Android Studio 中重新设置 ImageView 的动画
- typescript - VSCode 仅在导入符号时将 JSDoc 链接呈现到另一个文件