如何定义 is_instantiable 类型特征?
How would an is_instantiable type trait be defined?
让我们考虑以下形式的类型特征:
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
目前有问题的事情吗?
- 怎么可能 defined/implemented(如果它需要一些编译器魔法也没关系)?
目前不知道这样的东西有没有用? (如果您有任何有趣的用例,其中 is_constructible
受到限制,那就太棒了)。
我们反过来想一下。
我假设无法实例化的东西是指没有单个有效构造函数并且不是 in-built 类型的东西。
据我所知,你可以给任何东西一个类型的唯一方法,它的一个实例不能被构造,是通过强制转换(使用 reinterpret_cast
?)。
在我看来,编写这样的代码是一个可怕的决定,但我认为它在理论上是可能发生的。
我想,用例是这样一种情况,您期望您正在处理的对象可能是由这样的转换生成的,并且您想知道是否是这种情况。
问编译器绝对是一个深奥的问题,我不知道如何有效地使用这些信息,也不知道如何实现这个特性。
让我们考虑以下形式的类型特征:
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
目前有问题的事情吗? - 怎么可能 defined/implemented(如果它需要一些编译器魔法也没关系)?
目前不知道这样的东西有没有用? (如果您有任何有趣的用例,其中 is_constructible
受到限制,那就太棒了)。
我们反过来想一下。
我假设无法实例化的东西是指没有单个有效构造函数并且不是 in-built 类型的东西。
据我所知,你可以给任何东西一个类型的唯一方法,它的一个实例不能被构造,是通过强制转换(使用 reinterpret_cast
?)。
在我看来,编写这样的代码是一个可怕的决定,但我认为它在理论上是可能发生的。
我想,用例是这样一种情况,您期望您正在处理的对象可能是由这样的转换生成的,并且您想知道是否是这种情况。
问编译器绝对是一个深奥的问题,我不知道如何有效地使用这些信息,也不知道如何实现这个特性。