c++ - 如何decltype模板方法C++?
问题描述
我通过实现验证的概念编写接口。
传统方法没有问题:
// Interface realization
struct Realization
{
int* TestMethod(const std::string& aStr)
{
return (int *) aStr.c_str();
}
};
// Concept
template <typename T>
concept IRealization = std::is_same_v<decltype(&T::TestMethod), int* (T::*)(const std::string&)>;
// and then, for example
void Check()
{
static_assert(IRealization<Realization>)
}
但是当我尝试为模板方法编写类似的检查时:
// Interface realization
struct Realization
{
template <typename T>
int* TemplateMethod(const T& aStr)
{
return (int *) aStr.c_str();
}
};
,我遇到了一个模板方法的dectype问题,因为我不会写
decltype(&RealizationImpl::TemplateMethod)
(查看接口时,不知道要替换的类型)
请告诉我,我能否以某种方式获得没有类型的模板函数的签名,或者以其他方式解决我的问题?谢谢!
解决方案
你不应该写这样的概念。一个概念永远不应该检查像具有精确签名的成员函数这样具体的东西。相反,一个概念应该说,给定所讨论类型的实例,我应该能够做到,参数列表i.memberFunc(...)
在哪里。...
例如,您的“IRealization”概念(请不要在概念前加上I
. 概念不是接口)应该说“T
必须有一个可以在给定std::string
参数的情况下调用的成员函数,并产生可转换为 . 的东西int
。” 那看起来像:
template <typename T>
concept IRealization = requires(T t, std::string str)
{
{ t.TestMethod(str) } -> convertible_to<int>;
};
这允许用户提供一个TestMethod
,例如,std::string_view
而不是std::string
. 对类型进行如此难以置信的限制是没有意义的。
检查是否T
具有可使用某种类型调用的成员函数的概念必须在和U
上进行模板化:T
U
template <typename T, typename U>
concept IRealization = requires(T t, U u)
{
{ t.TestMethod(u) } -> convertible_to<int>;
};
推荐阅读
- angular - 如何等到TestCafe中的角度执行?
- layout - 评论后添加附加标签
- javascript - 无限自动播放纯 CSS 轮播
- angular - Angular 7 中有没有办法在编译时决定使用哪个服务?
- r - 如何将字符串因子转换为日期?
- r - 在ggplot2中将锯齿线转换为样条线
- reactjs - 在 Redux 操作中获取 response.Token
- c# - Windows 7 上 WinForms 应用程序中“粘贴”命令的行为(法语)
- scala - MockitoSerializationIssue:反序列化 Mockito 模拟时找不到类
- python - 使用自定义 mod_wsgi 和 python 对共享服务器的访问受限