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)...);
}