相关疑难解决方法(0)

C++ 11是模板的is_same类型特征

是否可以检查该类型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)?

c++ templates metaprogramming type-traits c++11

31
推荐指数
1
解决办法
4794
查看次数

使用概念禁用类专门化

我正在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

如何使用概念实现这一点?

c++ c++-concepts c++20

8
推荐指数
1
解决办法
170
查看次数

检查类是否是模板专业化

我想检查一个类是否是另一个的模板专用化。我试过的是:

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;

c++

8
推荐指数
1
解决办法
201
查看次数

Type_traits * _v变量模板实用程序命令无法编译

看到这个答案后,我试图为它的代码提供一个变量模板实用程序:

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)

c++ templates template-specialization variable-templates

8
推荐指数
2
解决办法
130
查看次数

检查类是否具有模板特化(使用 bool 或 int 等模板参数)

基于如何判断模板类型是否是模板类的实例?检查类是否是模板专业化?我创建了以下变体来检查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)

c++ templates type-traits variadic-templates c++17

6
推荐指数
1
解决办法
103
查看次数

如何检查模板专业化是否是基本模板的子类?

使用检查类是否是模板专业化?,我可以检查一个类是否是模板的特化。

使用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)

c++ templates template-meta-programming

5
推荐指数
1
解决办法
716
查看次数

boost::hana 如何检查类型是否为 std::可选?

我搜索了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++ boost boost-hana

3
推荐指数
1
解决办法
3111
查看次数