我在构建可变参数模板时遇到问题,其中扩展函数正确匹配非 const 和 const std::string
。我有一个通用匹配函数,在某些情况下会调用它。
我已将代码简化为以下示例。不是字符串的东西应该以通用函数结尾。作为字符串的东西应该在另外输出“STRING”的第二个函数中结束。
#include <iostream>
#include <string>
template<typename X, typename T>
void extend_exception( X & ex, T&& value )
{
ex << value << std::endl;
}
template<typename X>
void extend_exception( X & ex, std::string && value )
{
ex << "STRING: " << value << std::endl;
}
template<typename X, typename TF, typename ... TR>
void extend_exception( X & ex, TF&& f, TR&& ... rest )
{
extend_exception( ex, std::forward<TF>(f) );
extend_exception( ex, std::forward<TR>(rest)... );
}
int main()
{
extend_exception( std::cout, std::string( "Happy" ) );
std::string var( "var" );
extend_exception( std::cout, var );
extend_exception( std::cout, var, std::string( "Combo" ), const_cast<std::string const&>(var));
return 0;
}
在上面的版本中,这两种var
用法不会传递给字符串函数。我尝试了各种其他指定参数的方法,但似乎都没有成功:std::string && value
, std::string const & value
, std::string const && value
. 我也确实尝试std::string & value
过,然后非常量字符串匹配,但不是 const 字符串。这通过具有两个不同的功能为我提供了至少一种解决方法,但我怀疑我不需要这样做。
我如何在这里编写一个函数来调用 const、非常量和临时字符串对象?
我正在使用 g++ 4.6.3