我正在寻找一种模式将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
背景:我创建了以下类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)