我正在尝试编写一个包含大量参数的模板函数,所以我只需要使用尽可能多的参数。我想以简单的方式做到这一点,因为我是一名新手程序员。我的功能代码是:
template<typename T1 = NULL, typename T2 = NULL>
void showMessage(T1 input1 = NULL, T2 input2 = NULL) { cout << to_str(input1) << to_str(input2) << endl; }
我想把它称为:
showMessage("Hello");
或
showMessage("Hello ","World");
但它似乎不起作用......
我不想将输入默认为“”,因为它们可能是数字或bool等。所以我使用了NULL。
通常这种东西适用于函数,所以我认为它也适用于模板。 :(
答案 0 :(得分:4)
您可以使用可变参数模板接受任意数量的参数。
void showMessage()
{
std::cout << std::endl;
}
template<typename T, typename... Args>
void showMessage(T const& first, Args&&... rest)
{
std::cout << first;
showMessage(std::forward<Args>(rest)...);
}
这里有一些更简单的东西,它也适用于C ++ 03(但它只接受有限数量的参数,并且它要求它们是默认的可构造的)
template<typename T = std::string,
typename U = std::string,
typename V = std::string>
void showMessage(T const& t = T(), U const& u = U(), V const& v = V())
{
std::cout << t << u << v << std::endl;
}
我在这里使用std::string
作为默认类型的原因是因为默认构造的一个在发送到cout
时不会打印任何内容。你可以为此目的制作自己的特殊类型:
struct Nothing {};
std::ostream& operator<<(std::ostream& os, Nothing) { return os; }
答案 1 :(得分:-1)
在C中,printf()的实现提供了一个如何使用'stdarg.h'中包含的va_list,宏来完成此任务的示例。
https://benlearn.wordpress.com/2012/02/03/variable-length-parameter-listing-cc/
答案 2 :(得分:-2)
如果您希望函数具有任意数量的参数(但至少有一个),则可以使用<stdarg>
。函数声明语法:
void showMessage(int nArguments,...);
第一个参数必须通过简单地放一个数字或任何其他方法(查找printf()
)来告诉你将跟随多少个参数。
要阅读参数,您需要使用va_list
,va_start()
,va_arg()
和va_end()
。