如何解决如何static_assert检查功能签名是否正确
代码
我有一个Observer Pattern之后的模板类型。
template <typename T>
class Subject {
public:
template <template<typename> typename Observer>
void Addobserver(Observer<T>& observer)
{
observers.push_back([&](const T& value) { observer.OnEvent(value); });
}
void Event(const T& value) const
{
for (auto& o : observers) {
o.OnEvent(value)
}
}
private:
std::vector<std::function<void(const T&)>> observers;
};
上面的方法很好用,但前提是Observer
是模板类型。因此,我可以修改模板签名并接受任何类型,无论它们是否已模板化。
template <typename Observer>
void Addobserver(Observer& observer)
{
observers.push_back([&](const T& value) { observer.OnEvent(value); });
}
问题
但是现在在主题和观察者之间没有任何类型匹配的编译时检查。 (编辑已指出,不能保证Observer<T>
在其T
函数签名中实际上使用OnEvent
)
我想向该函数添加一个静态强制类型转换,以检查Subject<**T**>
和Observer::OnEvent(const **T**&)
这两种类型是否相同,以防止自动转换类型。像下面这样。
static_cast(std::is_same<T,**type_of_first_param**(Observer::OnEvent)>::value,"Subject/Observer type mistatch.");
我需要帮助的可能方法
如果我不能从函数签名中提取类型,也许我可以构造一个可以与之进行比较的函数签名?
static_cast(std::is_same<**Observer::MadeUpFunc(const T&)**,Observer::OnEvent>::value,"Subject/Observer type mistatch.");
我正在调查this QA,并且我很确定它可以满足我的需要,只需要一些时间,也许还需要一些指导才能弄清楚。
我尝试了以下操作,但出现了编译时错误
类型名称说明符指的是“观察者”中的非类型成员“事件”。
static_assert(std::is_same<typename Observer::OnEvent,void (Observer::*)(const T&...)>::value,"");
我尝试过的
- 我已经在cppreference.com/w/cpp/types 处阅读了文档
- 我已在cppreference.com/w/cpp/language处阅读了一些文档,即功能和模板 下的部分
- 我已经读过这个drdobbs.com/cpp/extracting-function-parameter-and-return
- 我查看了这些相似质量检查Extracting function argument types as a parameter pack,“unpacking” a tuple to call a matching function pointer
解决方法
我不清楚您要在此设置哪些限制。 限制性最强的是强制执行以下操作:
static_assert(std::is_same_v<decltype(&Observer::OnEvent),void (Observer::*)(const T&) const>);
其中OnEvent
函数不能是template
,它不能返回void
之外的任何东西,它需要标记为const
,并且即使const T&
是T
,也要花费int
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。