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

时间:2010-09-23 00:35:18

标签: c++ formatting fastformat

FastFormat库的工作原理如下:

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

它还声称“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";

1 个答案:

答案 0 :(得分: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

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

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

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