C ++中的模板函数,包含任意数量的参数

时间:2014-12-04 04:54:05

标签: c++ function templates arguments

我正在尝试编写一个包含大量参数的模板函数,所以我只需要使用尽可能多的参数。我想以简单的方式做到这一点,因为我是一名新手程序员。我的功能代码是:

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。

通常这种东西适用于函数,所以我认为它也适用于模板。 :(

3 个答案:

答案 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_listva_start()va_arg()va_end()