如何通过创建类型特征来对NTTP类进行分类?

3
在C++20中,NTTP扩展了新类型,引入了术语“结构性”:
- 左值引用 - 整数类型 - 指针、成员指针和空指针 - 枚举类型 - 浮点数类型 - 类型中:所有基类和非静态数据成员都是公共的、不可变的,并且数据成员和基类的类型也必须是递归地“结构性”的(我猜),以及数组。
来源:https://en.cppreference.com/w/cpp/language/template_parameters 以下是一个无法正常工作的解决方案实现:
template <auto>
struct nttp_test {};

template <typename T, typename = void>
struct is_structural : std::false_type {};

template <typename T>
struct is_structural<T, std::void_t<nttp_test<T{}>>> : std::true_type {};

template <typename T>
inline constexpr bool is_structural_v = is_structural<T>::value;

我不确定那是否有效,但我担心默认初始化(也不能使用std::declval)。

如果它无法实现,那么是否涉及编译器魔法


1
这解决了你的一部分问题,如果你尝试使用非结构类型Tis_structural<T>,会在编译时出现错误:https://godbolt.org/z/Ts9Gzz5aa(可能可以修复为`false`,但我无法做到) - undefined
自从 https://stackoverflow.com/questions/61929851 重新开放以来,假设您知道如何构建一个 T - undefined
2个回答

5
template <auto>
struct nttp_test {};

template<class T> 
concept structural = requires { []<T x>(nttp_test<x>) { }; };

演示。


很不幸,目前的clang trunk(18)将其视为严重错误;一个解决方法是使用另一个测试模板template<class T, template<T> class> struct nttp_test2;并测试typename nttp_test2<T, nttp_test>;:https://godbolt.org/z/zd5Tc4Tnj - undefined
提交了https://github.com/llvm/llvm-project/issues/71684 - undefined

2

在这里,还有一个可能有帮助的C++20构造:

template<auto> class Meow {};

template<class T> concept meow = requires { typename Meow<T{}>; };

struct Nyan {};

int main() {
        std::cout << std::boolalpha << meow<int> << '\n';
        std::cout << std::boolalpha << meow<Nyan> << '\n';
        std::cout << std::boolalpha << meow<std::string> << '\n';
}

将一个概念转化为一个好的特征,嗯...template<class T> using is_meow = std::bool_constant<meow<T>>;


我真的很困惑,不知道NTTP是否也需要对类型进行默认初始化。 - undefined
1
@DesmondGold 不行,这个不起作用。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接