c++ - 如何在带有初始值设定项的构造函数中使用 vprintf/cstdarg 功能?

标签 c++ constructor variadic-functions

我想创建一个类 MyException,它扩展了 std::runtime_error,异常消息具有 printf 语法。我想这样使用它:

int main()
{
    int index = -1;
    if (index < 0)
        throw MyException("Bad index %d", index);
}

如何为 MyException 编写构造函数?

class MyException: public std::runtime_error
{
    MyException(const char* format ...):
        runtime_error(what?)
};

我假设我必须将 va_list 和对 vprintf 的调用放在某个地方,但我如何将其与初始化语法结合起来?

最佳答案

sprintf 中使用可变参数模板:

class MyException: public std::runtime_error {

    char buf[200]; // One issue: what initial size of that?

    template<class ... Args>
    char* helper(Args ... args)
    {
        sprintf(buf, args...);
        return buf;
    }
public:
    template<class ... Args>
    MyException(Args ... args):
         std::runtime_error( helper(args...) ) 
         {
         }
};

Full example

关于c++ - 如何在带有初始值设定项的构造函数中使用 vprintf/cstdarg 功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57841769/

相关文章:

c++ - 为什么一个结构有另一个结构作为成员包装在一个 union 中,如果没有显式默认构造函数则不能编译?

Java 8 流和可变参数

java - 为什么要在 Java Stream 接口(interface)中重载 varargs 方法 of()?

c++ - 从函数的可变参数构建特定的元组

c++ - 向类的构造函数添加虚拟参数以解决调用歧义是否违反任何规则?

Java:使用类型参数访问私有(private)构造函数

c++ - C++中的策略模式。实现方案

c++ - 如何创建隐藏目录

c++ - 需要解释如何使用 C++ 在 Linux 上创建 utf-8 编码的文件

C++ 如何绑定(bind)和调用模板化类型方法