是否可以检查该类型T是否std::array为任意类型和大小?
我可以检查一个特定的数组,例如:
is_same<T, std::array<int,5>>::value
Run Code Online (Sandbox Code Playgroud)
但我想检查一下T是否有任何实例化std::array.像下面的东西(当然,这不会编译):
is_same<T, std::array>::value
Run Code Online (Sandbox Code Playgroud)
有没有办法实现这一点(可能没有使用is_same)?
我正在std::span使用Concepts TS 实现我自己的版本.我无法实现这些构造函数:
template<class Container> constexpr span(Container& cont);
template<class Container> constexpr span(const Container& cont);
Run Code Online (Sandbox Code Playgroud)
备注:这些构造函数不应参与重载决策,除非:
Container不是专业化的span,而且Container 不是专业化的 array如何使用概念实现这一点?
我想检查一个类是否是另一个的模板专用化。我试过的是:
template <class T, template <class...> class Template>
struct is_specialization : std::false_type {};
template <template <class...> class Template, class... Args>
struct is_specialization<Template<Args...>, Template> : std::true_type {};
Run Code Online (Sandbox Code Playgroud)
当所有模板参数都是类型实参,但不是某些非类型实参时,它可以正常工作。例如,它可以使用std::vector但不能使用std::array(因为后者接受一个非类型参数std::size_t)。
在编译时进行检查很重要。同样,该解决方案必须适用于任何模板,而不仅仅是矢量或数组。这意味着它可以是任意数量的类型参数和任意数量的非类型参数。例如,它应该与template <class A, bool B, class C, int D, class... Args> class foo;
看到这个答案后,我试图为它的代码提供一个变量模板实用程序:
template <class T, template <class...> class Template>
struct is_specialization : std::false_type {};
template <template <class...> class Template, class... Args>
struct is_specialization<Template<Args...>, Template> : std::true_type {};
Run Code Online (Sandbox Code Playgroud)
并像这样实现它:
template <template <class...> class Template, class... Args>
constexpr bool is_specialization_v = is_specialization<Template<Args...>, Template>::value;
Run Code Online (Sandbox Code Playgroud)
因为这就是我看到要在的头文件中实现类似的实用程序的方式<type_traits>。例如:
template <typename _Tp, typename _Up>
inline constexpr bool is_same_v = is_same<_Tp, _Up>::value;
template <typename _Base, typename _Derived>
inline constexpr bool is_base_of_v = is_base_of<_Base, _Derived>::value;
template <typename _From, typename _To>
inline constexpr bool is_convertible_v …Run Code Online (Sandbox Code Playgroud) 基于如何判断模板类型是否是模板类的实例?并检查类是否是模板专业化?我创建了以下变体来检查MyClass1, MyClass2or 的特定实例MyClass3:
template <class T, template <class...> class Template>
constexpr bool is_instance_of_v = false;
template <template <class...> class Template, class... Args>
constexpr bool is_instance_of_v<Template<Args...>, Template> = true;
template<class T> struct MyClass1 { };
template<class T, class B> struct MyClass2 { };
template<class T, bool B> struct MyClass3 { };
int main(int argc, char* argv[])
{
constexpr bool b1 = is_instance_of_v<MyClass1<float>, MyClass1>;
constexpr bool b2 = is_instance_of_v<MyClass1<float>, MyClass2>;
// constexpr bool …Run Code Online (Sandbox Code Playgroud) 使用检查类是否是模板专业化?,我可以检查一个类是否是模板的特化。
使用std::is_convertible<A*, B*>,我可以检查 A 是否是 B 的子类。
我怎样才能实现is_convertible_specialization,一些可以做的事情:
template<typename ... Args>
class Base {};
template<typename ... Args>
class Child : public Base<Args...> {};
template<typename ... Args>
class Unrelated{};
static_assert( is_convertible_specialization<Child<int, int>, Base>{} ); // True
static_assert( is_convertible_specialization<Unrelated<int, int>, Base>{} ); // False
Run Code Online (Sandbox Code Playgroud)
我已经尝试过一些事情,但我在 TMP 方面的技能还很缺乏,所以我认为我还没有接近。我的“最好”尝试是:
template<template<class...> class ChildTemplate, template<class...> class Template, class... Args>
struct is_convertible_specialization : std::false_type {};
template<template<class...> class ChildTemplate, template<class...> class Template, class... Args>
struct is_convertible_specialization<ChildTemplate<Args...>, Template> : std::true_type {
is_convertible_specialization() { …Run Code Online (Sandbox Code Playgroud) 我搜索了boost::hana::traits我找不到任何与检查类型概念相关的内容。例如 is_vector、is_Optional。hana 有没有什么工具可以简化这个?此外,我想根据结果对代码进行分支,因此需要在 hana::eval_if 中使用它。谁能给我举一些例子吗?
我想按照以下方式工作:
hana::eval_if(
is_vector(hana::decltype_(val)),
[&](auto _) {std::cout << "is vector\n";},
[&](auto _) {
hana::eval_if(
is_optional(hana::decltype_(val)),
[&](auto _) { std::cout << "is optional\n"; },
[&](auto _) { std::cout << "neither vector nor optional\n"; }
);
}
);
Run Code Online (Sandbox Code Playgroud) c++ ×7
templates ×4
type-traits ×2
boost ×1
boost-hana ×1
c++-concepts ×1
c++11 ×1
c++17 ×1
c++20 ×1