我正在尝试学习C++ 20中的概念,并且有一个代表数据样本的类。我想限制此类仅接受浮点类型或复杂的浮点类型,但是我似乎无法弄清楚如何使用概念来处理复杂的值。
没有概念,这很简单,但是它允许太多我不想允许的其他数据类型。
没有概念的示例:

template <typename T>
class Sample
{
    // ...
};

int main()
{
    // This compiles
    Sample<double> s1;
    Sample<complex<double>> s2;

    // This also compiles (but I don't want it to!)
    Sample<int> s3;
    // This compiles as well (again, I don't want it to!)
    Sample<complex<int>> s4;
}
通过概念,我可以轻松地将其限制为仅采用浮点值,但不适用于复杂的值。
template<floating_point T>
class Sample
{
    // ...
};

int main()
{
    // This compiles
    Sample<double> s1;
    Sample<float> s2;

    // This does NOT compile (but I do want it to!)
    Sample<complex<double>> s3;
}
如何创建一个概念来限制模板使用实际浮点值和复杂浮点值?

最佳答案

这是一个使用部分特殊化来检查T是否是浮点类型的std::complex特殊化的解决方案:

template <typename T>
struct is_complex : std::false_type {};

template <std::floating_point T>
struct is_complex<std::complex<T>> : std::true_type {};
这样,您可以编写概念:
template <typename T>
concept complex = std::floating_point<T> || is_complex<T>::value;
这是demo

关于c++ - 复杂浮点类型的C++ 20概念,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/64287476/

10-12 21:30