如何解决可变参数模板-类型修饰符
是否可以包装或更改可变参数模板参数的类型?例如。给模板参数int,float,double
返回std::tuple<const int*,const float*,const double*>
或std::tuple<std::unique_ptr<int>,std::unique_ptr<float>,std::unique_ptr<double>>
时是什么?
我问是因为我有这段非可变代码:
#pragma once
#include <Variant>
namespace fw::variant {
/*- Returns a variant with a pointer to the value of vFrom.*/
template<typename Arg1,typename Arg2>
std::variant<Arg1*,Arg2*> GetPointerVariant(std::variant<Arg1,Arg2>& vFrom) {
if (std::holds_alternative<Arg1>(vFrom)) {
return &std::get<Arg1>(vFrom);
}
return &std::get<Arg2>(vFrom);
}
/*- Returns a variant with a pointer to the value of vFrom.*/
template<typename Arg1,typename Arg2>
const std::variant<const std::remove_const_t<Arg1>*,const std::remove_const_t<Arg2>*> GetPointerVariant(const std::variant<Arg1,Arg2>& vFrom) {
if (std::holds_alternative<Arg1>(vFrom)) {
return &std::get<Arg1>(vFrom);
}
return &std::get<Arg2>(vFrom);
}
}
我想使其可变。
解决方法
是的,您可以这样定义类型特征:
template <
template <typename...> typename V,template <typename> typename Op,typename... Args
>
struct modify {
using type = V<typename Op<Args>::type...>;
};
其中V
是模板模板参数,可容纳可变模板参数,例如std:variant
或std::tuple
,
而Op
是您要修改可变参数模板参数Args...
的内容。
然后,您只需定义自己的Op
:
template <typename T>
struct Op1 { using type = const T*; };
template <typename T>
struct Op2 { using type = std::unique_ptr<T>; };
它将起作用:
static_assert(std::is_same_v<
std::tuple<const int*,const float*,const double*>,modify<std::tuple,Op1,int,float,double>::type
>);
static_assert(std::is_same_v<
std::variant<std::unique_ptr<int>,std::unique_ptr<float>,std::unique_ptr<double>>,modify<std::variant,Op2,double>::type
>);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。