首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >是否可以在可变函数中处理非原语类型?

是否可以在可变函数中处理非原语类型?
EN

Stack Overflow用户
提问于 2018-06-14 07:29:13
回答 1查看 329关注 0票数 2

我有两个版本的相同的可变函数,但是一个可以工作,另一个不能工作。我怀疑这是因为一个使用原语类型,而另一个使用std::string。

代码语言:javascript
复制
void test1(int f_num, ...)
{
    va_list file_names;
    va_start(file_names, f_num);

    for(int i=0; i<f_num; i++)
    {
        string name = string(va_arg(file_names, char*));
        cout << name << endl;
    }
    va_end(file_names);
}

void test2(int f_num, ...)
{
    va_list file_names;
    va_start(file_names, f_num);

    for(int i=0; i<f_num; i++)
    {
        string name = va_arg(file_names, string);
        cout << name << endl;
    }
    va_end(file_names);
}

int main()
{
    test1(3, "Hallo", "you", "people");
    test2(3, "Hallo", "you", "people");
}

以上结果将产生以下输出:

代码语言:javascript
复制
Hallo
you
people
terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc
Aborted (core dumped)

因此,第一个函数可以工作,但是第二个函数不能工作。我认为这是因为变量宏不能处理非原语类型,这样的假设正确吗?你能让它处理非限制类型吗?

EN

回答 1

Stack Overflow用户

发布于 2018-06-14 07:41:44

第一部分的答案是,你基本上是正确的。类类型的使用有一些限制,特别是如果它们有一个非平凡的复制构造函数( std::string有)。它可能在一些实现上工作,而在另一些实现上不起作用。从形式上讲,这是由实现定义的语义有条件地支持的。

第二部分比较难,但也比较简单。这些varargs是旧的C,而不是类型安全的。C++确实有类型安全的变体,通过模板:

代码语言:javascript
复制
template<typename... T>
void test1(T... args)
{
    std::cout << ... << args << std::endl;
}

问题是,你需要知道如何解压这些args... --它们被称为。有几种不同的方法可以对它们进行解包;这种特殊的形式称为折叠表达式。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50847671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档