C++ 从同级参数推导模板变量参数
我有一个简单的模板结构:C++ 从同级参数推导模板变量参数,c++,c++20,C++,C++20,我有一个简单的模板结构: template<typename T, typename ...Args> struct Packet { void DoSmth(Args... args){} }; //usage struct Packet1Model{}; struct Packet1: Packet<Packet1Model, int,float ,int>{ }; 这是主要的想法,我可以做任何修改,只要广泛的接口是相同的 部分专业化能做到这一点吗 谢谢
template<typename T, typename ...Args>
struct Packet {
void DoSmth(Args... args){}
};
//usage
struct Packet1Model{};
struct Packet1: Packet<Packet1Model, int,float ,int>{
};
这是主要的想法,我可以做任何修改,只要广泛的接口是相同的
部分专业化能做到这一点吗
谢谢大家! 您可以使用包装类(以及获取模板参数的相关基类的技巧)按照以下方式进行操作:
是否需要对其进行推断?如果它们是错误的,它将无法编译。有C++17演绎指南可能会有所帮助,但一般来说,无法根据正文推断出参数。@Davidsherring这不是
std::forward
->Packet2:Packet
的情况吗,所以我可以做Func(std::move(myMovedString))
?@BalanNarcis:这确实有效,尽管你也可以使用static\u(args)在这个例子中,我假设从你的例子中,对象类型是有意的。简单地说,没有一种更直接的方式来执行我所要求的。希望下一代C++会有某种指导的模板参数演绎。谢谢。@ BalnARCARIS:问题是包不是第一类,所以我们不能只写代码>模板V。oid Func(get_the_pack…{…}
。事实上,有一些建议允许更容易地引入包,但我不能立即确定其中是否有任何一个涉及到这种情况。
//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, float, 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);
}
template<class P,class ...AA>
void Func(AA &&...aa) {
P myLocalT;
myLocalT.DoSmth(std::forward<AA>(aa)...);
}