这有点晚了,但在 C++17 中你可以做到这一点,std::tuple
总体上会很好。这是对@xavlours 答案的扩展:
template <class... Args>
void func (std::tuple<Args&&...> t, SomeSpecialType num = fromNum(5))
{
// std::apply from C++17 allows you to iterate over the tuple with ease
// this just prints them one by one, you want to do other operations i presume
std::apply([](auto&&... args) {((std::cout << args << '\n'), ...);}, t);
}
然后,制作一个简单的函数来准备它们:
template<typename... Args>
std::tuple<Args&&...> MULTI_ARGS(Args&&... args) {
return std::tuple<Args&&...>(args...);
}
现在您可以像这样调用该函数:
func(MULTI_ARGS(str1, int1, str2, str3, int3)); // default parameter used
func(MULTI_ARGS(str1, int1, str2)); // default parameter used
func(MULTI_ARGS(str1, int1, str2, str3, int3, otherStuff), fromNum(10)); // custom value instead of default
免责声明:我在设计记录器时遇到了这个问题,并希望有一个默认参数,其中包含std::source_location::current()
并且据我所知,这是确保调用者信息准确传递的唯一方法。制作函数包装器将更改source_location
信息以表示包装器而不是原始调用者。