gpt4 book ai didi

c++ - 概念检查可以延迟到 C++ 中的类实例化吗?

转载 作者:行者123 更新时间:2023-12-04 14:53:47 26 4
gpt4 key购买 nike

加速编译的一个常见做法是只声明类而不是给出它们的完整定义,例如

struct A;
template<typename T> struct B;
using C = B<A>;

如果喜欢在模板类中使用C++20的概念那么代码如下

#include <concepts>
struct A;
template<std::destructible T> struct B;
using C = B<A>;

会导致错误:

error: template constraint failure for 'template<class T>  requires  destructible<T> struct B'
| using C = B<A>;

是否有可能以某种方式将概念检查时间延迟到 B<A>真的被使用/实例化了吗?如果不是,那么概念似乎会通过强制包含以前隐藏的类定义来显着减慢某些程序的编译速度。

最佳答案

这就是您转发声明的方式。

struct A;
template<class T> struct B;
using C = B<A>;

保留这个。在 B.h :

#include <concepts>
template<class T> struct B;
// or
template<class T> struct B
{
static_assert( std::destructible<T> );
};

template<std::destructible T>
struct B<T> {
};

特化。离开基地B<T>未定义。

现在,您不会“提前”检查您遇到的错误,而是在较晚的时间点检查。所以路过TB<>不会以 SFINAE 友好的方式检查。

但这基本上是您要求在您的问题中不要发生的事情。

请注意 static_assert可能,根据标准的某些读数,使您的程序格式错误,不需要诊断。基本上所有特化(包括基础特化)都必须有一个有效的实例化,而其他特化的模式匹配使这成为不可能。

但实际上我认为您只会收到一条错误消息。

关于c++ - 概念检查可以延迟到 C++ 中的类实例化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68556093/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com