如何在接受无限量参数的函数中保证类型安全?

frm*_*frm 4 c++ formatting fastformat

FastFormat库的工作原理是这样的:

string example;
fastformat::fmt(example, "I am asking {0} question on {1}", 1, "stackoverflow");
Run Code Online (Sandbox Code Playgroud)

它还声称"100%类型安全".我可以理解其他库如何boost::format通过重载实现这operator%一点,我也经常使用我的代码.

但是,如果我能够使用逗号,那么对其他程序员来说就不那么令人惊讶了.我真的很想知道如何在没有模板操作符重载技巧的情况下保证类型安全.


除了注意:如果你想知道什么是"模板化运算符重载技巧",这就是boost :: format的工作原理(主要是):

struct Test
{
    template<class T>
    Test& operator%(const T& what) { cout << what << "\n" /* Example */; return *this; }
};

Test() % 5 % "abc";
Run Code Online (Sandbox Code Playgroud)

Jam*_*lis 6

fastformat::fmt() 接受无限数量的论点.只有许多重载需要固定数量的参数.例如,重载可能如下所示:

template <typename T0>
std::string fmt(const std::string& format_str, const T0& arg0);

template <typename T0, typename T1>
std::string fmt(const std::string& format_str, const T0& arg0, const T1& arg1);

// etc. for more numbers of arguments
Run Code Online (Sandbox Code Playgroud)

使用时fmt(),会发生重载解析以选择具有正确数量参数的函数.

您必须检查文档中它支持的参数数量,但它绝对不是无限数量.

在C++ 0x中,您将能够使用可变参数模板获得无限(好的,几乎无限制)的参数和类型安全性.