drogonframework / drogon

Drogon: A C++14/17/20 based HTTP web application framework running on Linux/macOS/Unix/Windows
MIT License
11.44k stars 1.1k forks source link

HttpController 参数映射能否支持枚举类型 #1909

Closed SV-Guo-Liliang closed 8 months ago

SV-Guo-Liliang commented 8 months ago

我在用doxygen生成文档,用int来接收当然可以,但是文档不能生成关联枚举的说明

an-tao commented 8 months ago

我不确定,但你可以试试,在controller那个头文件里添加如下偏特化:

template <>
inline Enum_Type getHandlerArgumentValue<Enum_Type>(std::string &&p)
{
    ...
}
SV-Guo-Liliang commented 8 months ago

我不确定,但你可以试试,在controller那个头文件里添加如下偏特化:

template <>
inline Enum_Type getHandlerArgumentValue<Enum_Type>(std::string &&p)
{
    ...
}

非常感谢。 我试过后好像不太行。这个getHandlerArgumentValue函数在HttpBinder.h,写在controller报错,不起作用。

an-tao commented 8 months ago

等我试试,给你回复

an-tao commented 8 months ago

我试了一下,可以工作,你要把转换的特化模板放到合适的namespace里,如下:

enum Stat
{
    kNone=0,
    kStart,
    kEnd
};
namespace drogon::internal
{
template <>
inline Stat getHandlerArgumentValue<Stat>(std::string &&p)
{
    if (p=="1") return kStart;
    if (p=="2") return kEnd;
    return kNone;
}
}
class TestCtrl : public drogon::HttpController<TestCtrl>
{
  public:
    METHOD_LIST_BEGIN
    ADD_METHOD_TO(TestCtrl::test, "/test/{1}", Get); // path is /absolute/path/{arg1}/{arg2}/list
    METHOD_LIST_END

    void test(const HttpRequestPtr& req, std::function<void (const HttpResponsePtr &)> &&callback, Stat s) const;
};
SV-Guo-Liliang commented 8 months ago

👍感谢大佬,OK了 防止疑惑:此方法只能在v1.9.1以及以后可以使用