gpt4 book ai didi

C++ va_list 函数重载

转载 作者:行者123 更新时间:2023-11-30 02:38:32 25 4
gpt4 key购买 nike

我目前有 2 个函数重载:

void log(const char* format, ...);
void log(const string& message);

我希望在这个调用的情况下:log("hello"); 将调用字符串版本,或者换句话说,只有在有 2 个参数的情况下才应调用第一个重载或更多。

我考虑过这样做:

template<typename T>
void log(const char* format, T first, ...);

但在这种情况下,我将无法在代码中正确使用 va_list

我可能还缺少任何其他解决方案吗?

编辑:我考虑过从函数内部检查 va_list 的大小,并在 0 的情况下重定向,但据我所知,不可能获得 va_list 的大小。

最佳答案

  1. 强制类型构造:log(std::string{"hello})。但这并不是您真正想要的。
  2. 在其中一个函数中,调用另一个函数。

    void log(const string& s)  
    {
    log(s.c_str());
    }

    但它不是很有效,因为你将有一个无用的 string 对象,尽管编译器可能能够内联调用。

  3. 使用可变参数模板和 SFINAE:

    void log(const string&);
    auto log(const char *ptr, Args&& ... args) ->
    typename std::enable_if<sizeof...(Args) != 0, void>::type

    仅当存在尾随参数时,第二个重载才会在候选函数集中可用。 Showcase .在 C++14 中,您可以使用 std::enable_if 的简写版本 std::enable_if_t,这使语法更清晰:

    auto log(const char *ptr, Args&& ... args) -> std::enable_if_t<sizeof...(Args) != 0, void>

    你仍然可以在 C++11 中使用

    来简化它
    template <bool B, typename T>
    using enable_if_t = typename std::enable_if<B, T>::type;

如果您正在调用接受 va_list 的函数(例如 printf),您仍然可以扩展参数包:

std::printf(ptr, args...);

反之则不然。

关于C++ va_list 函数重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30761331/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com