我想写一个概念,描述任何对象,有一个模板化的方法称为reportsError
。该方法有一个模板参数T
是从Error
类派生(在源代码中定义的地方),可以接受任何数量的参数。函数reportsError
的实现内部将这些数据转发到std::make_unique
创建一个新的错误。
例如,下面的代码应该编译:
struct Error1 : public Error {}
struct Error2 : public Error {
int a;
Error2(int a): a(a) {};
}
template<class T> requires TheConceptIWant // don't know how to write this
void foo(T &t) {
t.reportsError<Error1>();
t.reportsError<Error2>(3);
}
字符串
但不包括:
template<class T> requires TheConceptIWant // don't know how to write this
void foo(T &t) {
t.reportsError<int>(0); // int is not a subclass of Error.
}
型
我不知道怎么写,如果你知道,请写下你的答案。非常感谢!
- 传递给函数
foo
的对象不需要是Error
的子类!它是TEMPLATE PARAMETER ON THE METHOD必须是!*
下面是一个示例对象,我希望它可以传递给函数foo
,(实际上可能无法成功编译):
struct ReportManager {
template<class T, class... Args>
void reportsError(Args&&... args) {
auto error = std::unique_ptr<T>(new T(std::forward<Args>(args)...));
// logic that handles and outputs this error to users.
}
};
// somewhere
int main() {
ReportManager obj;
foo(obj);
}
型
1条答案
按热度按时间0kjbasz61#
如果约束放在
reportsError
上,而不是foo
上,那么你要做的事情相对容易:字符串
现在,如果用户显式地提供
E
,则仅对Error
的派生类型满足约束。为“上一层”定义一个完美的概念是不可能的。概念只能验证某些表达式是格式良好的,而不能验证高级属性,如
此成员函数模板的所有专门化都是可变的,用于构造给定的
E
参数你能写的最好的是:
型
然而,没有办法验证
reportsError
是可变的,你最多只能强行将其增加到一定的数量。型
然后又道:
型
进一步说明
型
可以简化为
型