【发布时间】:2019-01-20 09:14:08
【问题描述】:
this snippet 中显示了我们如何在没有概念的情况下重载模板类的模板成员函数的示例。
现在大致尝试使用概念编写类似的东西:
template <typename T>
struct Foo{
Foo(T elem): elem_(elem) {}
template <typename U = T> requires Integral<U>
int get() {
return -1;
}
template <typename U = T> requires Bool<U>
int get() {
return 0;
}
T elem_;
};
有两种组织方式:
1. 将声明和定义放在一起:这按预期工作。 Code Snippet
2.声明和定义分离:编译失败(Code Snippet)
鉴于上述情况,我有两个问题:
1. 原来需要template <typename T> template <typename U=T> member_fn...的原因是因为SFINAE。有没有办法通过概念来避免这种情况以进一步简化代码?
2. 如何正确分离声明和定义?
【问题讨论】:
-
如果您保留声明(而不是删除它们),它将因为调用不明确的函数而失败。请注意,编译器对 C++20 功能的支持仍处于试验阶段。
-
用
Integral<T>表示只是int有点令人惊讶 -
@Barry 只是为了让它成为一个最小的运行示例。
标签: c++ templates c++-concepts c++20