c++ - 如何定义 is_instantiable 类型特征?

标签 c++ instance language-lawyer template-meta-programming typetraits

让我们考虑以下形式的类型特征:

template <class T>
struct is_instantiable
{
    static constexpr bool value = /* something */;
};

template <class T>
inline constexpr bool is_instantiable_v = is_instantiable<T>::value;

这将检测是否可以实例化 T 类型的实体。

目前标准库已经具有像 is_constructible 这样的特征(但它需要构造对象的参数)。我想知道:

  • is_instantiable 类型特征是否有用?
  • 它会允许目前 is_constructible 有问题的事情吗?
  • 如何定义/实现它(如果它需要一些编译器魔法也没关系)?

目前我不知道这样的东西是否有用? (如果您有任何有趣的用例,其中 is_constructible 有限制,那就太棒了)。

最佳答案

让我们反过来想一想。 我假设无法实例化的东西是指没有单个有效构造函数并且不是内置类型的东西。 据我所知,唯一可以为任何类型赋予无法构造其实例的方法是通过强制转换(使用 reinterpret_cast?)。 在我看来,编写这样的代码是一个可怕的决定,但我认为这在理论上是可能发生的。

我想,用例是这样一种情况,您期望您正在处理的对象可能是由此类转换生成的,并且您想知道情况是否如此。

问编译器绝对是一个深奥的问题,我不知道如何有效地使用这些信息,也不知道如何实现这个特性。

关于c++ - 如何定义 is_instantiable 类型特征?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49715831/

相关文章:

c++ - std::function 可以序列化吗?

C++ - 为模板类专门化成员函数

C++无法在cocos2d-x中获取全局变量的值

java - 非常基本的变量超出范围问题 - Java Android

JavaScript:如何在不使用 new 关键字的情况下创建类的新实例?

c++ - 声明指向 char 数组的指针数组

Javascript 导入/导出 CORS 问题

c++ - 嵌套在函数中的函数声明的命名空间

java - 私有(private)接口(interface)方法的方法引用

c++ - 推导指南、initializer_list 和类型推导过程