64,654
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <list>
#include <vector>
template <typename...Args>
void CFun(Args...args)
{
printf("Get %d arguments\n", sizeof...(args));
}
template <size_t... IntIndex, size_t... StrIndex>
void CFunWapper4(
const std::vector<int>& intargs,
const std::vector<std::string>& strargs,
std::index_sequence<IntIndex...>, std::index_sequence<StrIndex...>)
{
CFun(intargs[IntIndex]..., strargs[StrIndex]...);
}
template <int IntCount, int StringCount>
void CFunWapper3(const std::list<int>& intargs, const std::list<std::string>& strargs)
{
std::vector<int> intvec(intargs.begin(), intargs.end());
std::vector<std::string> strvec(strargs.begin(), strargs.end());
CFunWapper4(intvec, strvec,
std::make_index_sequence<IntCount>(),
std::make_index_sequence<StringCount>());
}
template <int ICount, int SCount>
struct CFunWapper2
{
static void HelpFun(const std::list<int>& intargs, const std::list<std::string>& strargs)
{
if (intargs.size() > ICount)
{
return CFunWapper2<ICount + 1, SCount>::HelpFun(intargs, strargs);
}
if (strargs.size() > SCount)
{
return CFunWapper2<ICount, SCount + 1>::HelpFun(intargs, strargs);
}
return CFunWapper3<ICount, SCount>(intargs, strargs);
}
};
template <int ICount>
struct CFunWapper2<ICount, 10>{
static void HelpFun(const std::list<int>& intargs, const std::list<std::string>& strargs) {};
};
template <int SCount>
struct CFunWapper2<10, SCount> {
static void HelpFun(const std::list<int>& intargs, const std::list<std::string>& strargs) {};
};
void CFunWapper(const std::list<int>& intargs, const std::list<std::string>& strargs)
{
CFunWapper2<0, 0>::HelpFun(intargs, strargs);
}
int main(int argc, char**argv)
{
std::list<int> ilist1{ 10, 20, 30 };
std::list<int> ilist2{ 2, 3 };
std::list<std::string> slist1{ "hello", "world" };
std::list<std::string> slist2{ "hello", "world", "yes!" };
CFunWapper(ilist1, slist1);
CFunWapper(ilist1, slist2);
CFunWapper(ilist2, slist1);
CFunWapper(ilist2, slist2);
return 0;
}