将指针和常量添加到 std::tuple<Types...>
Add pointer and const to std::tuple<Types...>
我正在尝试使用 C++11
模板的魔力实现以下目标:
假设我有这样的类型:
using my_types = std::tuple<char, int, float>;
有了这个,我想得到一个指针的元组到const
而不是值,即:
std::tuple<char *, int *, float *, const char *, const int *, const float *>;
我目前的解决方案:
template<typename T>
struct include_const {};
template<typename... Types>
struct include_const<std::tuple<Types...>> {
using type = std::tuple<Types..., typename std::add_const<Types>::type...>;
};
这得到 std::tuple<types, const types>
。要获得指点,我可以使用:
template<typename T>
struct add_ptr {};
template<typename... Types>
struct add_ptr<std::tuple<Types...>> {
using type = std::tuple<typename std::add_pointer<Types>::type...>;
};
这行得通,但我希望它变得更通用:我想要一个 template<trait, Types...> add_ptr
来为我提供指向 Types...
和 trait<Types>::type...
的指针,所以用法可能如下:
add_ptr<std::add_const, my_types>
就是我之前提到的元组
add_ptr<std::add_volatile, my_types>
给出 std::tuple<char *, volatile char *, ...>
对于如何实现这一点,我将不胜感激。我还不是模板魔术师,希望得到一些帮助
使用模板模板参数
template<template<typename> class Trait, typename U>
struct add_ptr {};
template<template<typename> class Trait, typename... Types>
struct add_ptr<Trait, std::tuple<Types...>> {
using type = std::tuple<
typename std::add_pointer<Types>::type...,
typename std::add_pointer<
typename Trait<Types>::type
>::type...
>;
};
然后
add_ptr<std::add_const, my_types>::type
将会
std::tuple<char *, int *, float *, char const *, int const *, float const *>
我正在尝试使用 C++11
模板的魔力实现以下目标:
假设我有这样的类型:
using my_types = std::tuple<char, int, float>;
有了这个,我想得到一个指针的元组到const
而不是值,即:
std::tuple<char *, int *, float *, const char *, const int *, const float *>;
我目前的解决方案:
template<typename T>
struct include_const {};
template<typename... Types>
struct include_const<std::tuple<Types...>> {
using type = std::tuple<Types..., typename std::add_const<Types>::type...>;
};
这得到 std::tuple<types, const types>
。要获得指点,我可以使用:
template<typename T>
struct add_ptr {};
template<typename... Types>
struct add_ptr<std::tuple<Types...>> {
using type = std::tuple<typename std::add_pointer<Types>::type...>;
};
这行得通,但我希望它变得更通用:我想要一个 template<trait, Types...> add_ptr
来为我提供指向 Types...
和 trait<Types>::type...
的指针,所以用法可能如下:
add_ptr<std::add_const, my_types>
就是我之前提到的元组
add_ptr<std::add_volatile, my_types>
给出 std::tuple<char *, volatile char *, ...>
对于如何实现这一点,我将不胜感激。我还不是模板魔术师,希望得到一些帮助
使用模板模板参数
template<template<typename> class Trait, typename U>
struct add_ptr {};
template<template<typename> class Trait, typename... Types>
struct add_ptr<Trait, std::tuple<Types...>> {
using type = std::tuple<
typename std::add_pointer<Types>::type...,
typename std::add_pointer<
typename Trait<Types>::type
>::type...
>;
};
然后
add_ptr<std::add_const, my_types>::type
将会
std::tuple<char *, int *, float *, char const *, int const *, float const *>