相关疑难解决方法(0)

实现可变参数类型特征

介绍

我正在寻找一种模式将C++类型特征转换为它们的可变参数.一个方法来解决这个问题,将不胜感激,并生成编程模式,以自动执行任务将是理想的.

请考虑以下事项:

std::is_same<T, U>::value; 
Run Code Online (Sandbox Code Playgroud)

我想写一个像这样的特征:

std::are_same<T1, T2, T3, T4>::value; 
Run Code Online (Sandbox Code Playgroud)

目前的做法

实现这个非常简单are_same ; 寻求一般解决方案,我们可以为任何实现通用量化的可变特性提供工具:

template<template<class,class> class F, typename...Ts>
struct Univ;

template<template<class, class> class F, typename T, typename U, typename...Ts>
struct Univ<F, T, U, Ts...>
{
    static const int value = F<T, U>::value && Univ<F, U, Ts...>::value;
};

template<template<class, class> class F, typename T>
struct Univ<F, T>
{
    static const int value = 1;
};
Run Code Online (Sandbox Code Playgroud)

所以,例如are_same …

c++ templates generative-programming template-meta-programming c++11

18
推荐指数
1
解决办法
2195
查看次数

检查所有可变参数模板参数的特征

背景:我创建了以下类C,其构造函数应该采用N类型的变量B&:

class A;
class B
{
    A* getA();
};

template<size_t N>
class C
{
public:
    template<typename... Args>
    inline C(Args&... args) :
        member{args.getA()...}
    {}
private:
    std::array<A*, N> member;
};
Run Code Online (Sandbox Code Playgroud)

问题:我的问题是如何将variadic约束Args为所有类型B

我的部分解决方案:我想定义一个谓词,如:

template <typename T, size_t N, typename... Args>
struct is_range_of :
    std::true_type // if Args is N copies of T
    std::false_type // otherwise
{};
Run Code Online (Sandbox Code Playgroud)

并相应地重新定义我的构造函数:

template <typename... Args,
          typename = typename std::enable_if<is_range_of_<B, N, Args...>::value>::type
         >
inline C(Args&... args); …
Run Code Online (Sandbox Code Playgroud)

c++ type-traits variadic-templates c++11 c++14

18
推荐指数
1
解决办法
2983
查看次数