如何解决具有两种类型的参数的c ++ varargs / variadic函数,这些参数一起重复交替
我可以找到一些示例,该示例如何使用重复StringFormat()
的一种类型编写可变参数函数,但是我需要编写两种不同类型重复交替的函数。
用法需要如下所示:
MyFunc(stringVar,intVar1,doubleVar1);
MyFunc(stringVar,doubleVar1,intVar2,doubleVar2,intVar3,doubleVar3,intVar4,doubleVar4);
该函数始终具有字符串输入,并且至少要包含一个int和一个double,但是int和double会一起重复。
如果可能的话,我还需要一种方法来使文档告诉您所使用的arg类型。也许文档会自动生成并且可以正常使用,但是万一您需要做一些特殊的事情,请也包括在内,或者如果不可能进行智能化工作,请告诉我。可能是这样的:???
/// <summary>
/// MyFunc Summary
/// </summary>
/// <param name="name">Name description</param>
/// <param name="event1_id">ID for Event 1</param>
/// <param name="event1_value">Value for Event 1</param>
/// ...
/// <param name="eventN_id">ID for Event N</param>
/// <param name="eventN_value">Value for Event N</param>
/// <returns>return description</returns>
解决方法
如果我了解您要执行的操作,则可以编写以下函数:
template<typename ...Ts>
void MyFunc(std::string Var,Ts ...ts)
{
// simple structure to store each pair of arguments
struct Arg { int i; double d; };
// checks narrowing conversions,// and incorrect type/number of arguments
std::array<Arg,sizeof...(Ts) / 2> arr { ts... };
// ensures at least one int and double argument
static_assert(std::size(arr) > 1);
// ...
}
这里是demo。
,我将通过创建类型特征来解决此问题。我的第一次尝试:
#include <iostream>
#include <type_traits>
namespace {
template <typename FIRST_EXPECTED,typename SECOND_EXPECTED,typename FIRST_ACTUAL,typename SECOND_ACTUAL,typename ...Ts>
struct repeating_pair {
static constexpr bool value = repeating_pair<FIRST_EXPECTED,SECOND_EXPECTED,FIRST_ACTUAL,SECOND_ACTUAL>::value &&
repeating_pair<FIRST_EXPECTED,Ts...>::value;
};
template <typename FIRST_EXPECTED,typename SECOND_ACTUAL>
struct repeating_pair<FIRST_EXPECTED,SECOND_ACTUAL> {
static constexpr bool value = std::is_same_v<FIRST_ACTUAL,FIRST_EXPECTED> &&
std::is_same_v<SECOND_ACTUAL,SECOND_EXPECTED>;
};
}
int main() {
std::cout << repeating_pair<int,double,int,double>::value << '\n'
<< repeating_pair<int,float>::value << '\n'
<< repeating_pair<int,float>::value << '\n';
return 0;
}
这将为您提供编译时检查是否有重复类型,您可以在MyFunc
中利用它。
template <typename FIRST,typename SECOND,typename ...Ts>
void MyFunc(std::string stringVar,FIRST intVar1,SECOND doubleVar1,Ts ...ts) {
static_assert(repeating_pair<int,FIRST,SECOND,Ts...>::value);
// whatever your code does
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。