【发布时间】:2020-05-23 01:06:57
【问题描述】:
我通过实现验证的概念编写接口。
常规方法没有问题:
// 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)
(查看接口时,不知道要替换的类型)
请告诉我,我能否以某种方式获得没有类型的模板函数的签名,或者以其他方式解决我的问题?谢谢!
【问题讨论】:
-
没有实例化就无法获得函数原型。您需要向该概念添加另一个模板参数,因为该概念不需要测试
T,而是T<U>。T<U1>可能会成功,但T<U2>可能会失败。 -
另外附注这个问题:
TestMethod应该完成什么?最好的情况是,如果对齐匹配,它会返回一个指针,在将其转换回char*之前不允许取消引用;最坏的情况是,如果对齐不匹配,它会返回一个具有未指定值且永远不可用的指针。 -
template <typename T> template <typename U> concept IRealization = std::is_same_v<decltype(&T::template TestMethod<U>), int* (T::*)(const U&)>;不会编译,所以不确定任何其他方式.. -
@walnut TestMethod 没有逻辑意义,它只是一个例子。你说得对,我应该想出一个更充分的例子
标签: c++ templates template-meta-programming c++20 c++-concepts