重载可变参数模板的固定参数

sma*_*sma 5 c++ variadic-functions variadic-templates c++14

是否可以通过在函数参数包之前更改固定参数的数量来覆盖可变参数模板?例如:

#include <iostream>

template <typename ...Args>
void foo(std::string, std::string, std::string, Args...) 
{ 
  std::cout << "THREE STRINGS\n"; 
}

template <typename ...Args>
void foo(std::string, std::string, Args...) 
{ 
  std::cout << "TWO STRINGS\n"; 
}

int main() {
  foo("key", "msg", "data", 1);
}
Run Code Online (Sandbox Code Playgroud)

运行它会导致第二个foo被调用,但我希望第一个被调用.有没有更好的方法来重载此功能?

use*_*670 6

选择第二个变体是因为它不涉及std::string为最后一个参数创建实例所需的额外转换.如果你明确地调用类构造函数(或调整参数以完全接受你传递的),那么它将正常工作:

foo(std::string{"key"}, std::string{"msg"}, std::string{"data"}, 1, 2); // THREE STRINGS
Run Code Online (Sandbox Code Playgroud)

在线编译器