gpt4 book ai didi

c++ - Variadic 模板匹配 const 和非常量 std::string 时遇到问题

转载 作者:太空宇宙 更新时间:2023-11-03 10:31:57 25 4
gpt4 key购买 nike

我在构造可变参数模板时遇到问题,其中扩展函数正确匹配非常量和常量 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 && valuestd::string const & value std::string 常量 && 值。我也确实尝试了 std::string & value 然后非 const 字符串匹配,但不是 const 字符串。这至少为我提供了一个具有两个不同功能的解决方法,但我怀疑我不需要这样做。

我如何在此处编写一个函数来调用 const、非常量和临时字符串对象?

我正在使用 g++ 4.6.3

最佳答案

这很棘手,T&& 是所谓的通用引用,但 std::string&& 不是(不涉及类型推导)。参见 here一个很好的解释。这是一个修复:

template<typename X, typename T>
void extend_exception_( X & ex, T&& value, ... )
{
ex << value << std::endl;
}

template<typename X, typename T,
typename = typename std::enable_if<
std::is_same<std::string, typename std::decay<T>::type>::value>::type>
void extend_exception_( X & ex, T && value, int )
{
ex << "STRING: " << value << std::endl;
}

template <typename T> using identity = T;

template<typename X, typename ... R>
void extend_exception( X & ex, R&& ... rest )
{
identity<bool[]>{false,(extend_exception_(ex, std::forward<R>(rest), 0), false)...};
}

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" ) );
}

关于c++ - Variadic 模板匹配 const 和非常量 std::string 时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14241495/

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