如何解决从同级论证中减去模板可变参数论证
我有这个简单的模板结构:
template<typename T,typename ...Args>
struct Packet {
void DoSmth(Args... args){}
};
//usage
struct Packet1Model{};
struct Packet1: Packet<Packet1Model,int,float,int>{
};
在C ++中是否有一种方法可以将函数作为模板参数
typename T
和另一个类型名称包typename... Args
,并从T
推导出该包?
更好的解释:
//Main ideea
template<typename PacketType,typename... Args>
void Func(Args... args) {//is there a way for this Args... pack to be "DEDUCED" as the Args... pack of PacketType::DoSmth() ?
PacketType myLocalPacketType;
myLocalT.DoSmth(std::forward<Args>(args)...);
}
// Wanted effect
//...
{
//eg. for Packet1 -> Args pack is (int,int)
Func<Packet1>(2,2.0f,3);
}
//...
这是主要思想,只要宽泛的界面相同,我就可以进行任何修改。
部分专业化可以实现吗?
谢谢!
解决方法
您可以使用包装器类(以及为模板参数获取相关基类的技巧)按照以下方式进行操作:
namespace detail {
template<class,class> struct Wrap;
template<class PacketType,class T,class ...TT>
struct Wrap<PacketType,Packet<T,TT...>> {
void Func(TT ...tt) {
PacketType myLocalT;
myLocalT.DoSmth(tt...);
}
};
template<class ...TT> Packet<TT...> UpCast(Packet<TT...>*); // not defined
}
template<class P>
using Wrap=detail::Wrap<P,decltype(UpCast(static_cast<P*>(nullptr)))>;
void client() {
Wrap<Packet1>::Func(2,2.0f,3);
}
当然,这样做会失去从重载解析中排除此特定Func
的可能性,因为参数不匹配,这似乎比琐碎的“乐观包装器”(鉴于这种不匹配,将会遇到非SFINAE错误):
template<class P,class ...AA>
void Func(AA &&...aa) {
P myLocalT;
myLocalT.DoSmth(std::forward<AA>(aa)...);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。