gpt4 book ai didi

c++ - Variadic 模板函数名称查找无法找到特化

转载 作者:搜寻专家 更新时间:2023-10-31 01:00:51 25 4
gpt4 key购买 nike

我正在尝试编写一个字符串连接函数,该函数利用我的 3D 库的字符串转换函数,通过可变参数模板实现。

如果将字符串(const char[] 文字或 std::string)传递给它,库的转换函数会表现异常。因为它实际上不具备这些类型的功能,所以我想专门化模板以将它们拉出而不是通过转换器运行它们。即使转换器处理了它们,优化也是一个很好的理由。

template<typename T>
inline String c(T a)
{
return Ogre::StringConverter::toString( a );
}
template<>
inline String c(String s)
{
return s;
}
template<>
inline String c(const char s[])
{
return s;
}

template<typename T, typename... Args>
inline String c(T a, Args... args)
{
return Ogre::StringConverter::toString( a ) + c(args...);
}
template<typename... Args>
inline String c(String s, Args... args)
{
return s + c(args...);
}
template<typename... Args>
inline String c( const char s[], Args... args)
{
return s + c(args...);
}

但是,当我编译我的程序时,字符串文字有时会通过 const char[] 特化并由基本的非特化模板处理。命令:

U::c( "This is dMap[500][500]: ", dMap[500][500], " and this is 5: ", 5, "." )

返回

This is dMap[500][500]: 112true5.

如果将字符串文字传递给它,则“true”是 toString 返回的内容。调试确认第二个字符串文字被通用 String c(T a, Args... args) 捕获,但不是第一个或第三个,它们由特化处理。

这似乎与 Selecting string literal type for template specialization 中提到的问题有关,但更改我的模板参数声明与该解决方案中建议的匹配,inline String c( const char (&s) [N], Args... args ),导致第一个参数被专门的模板,但不是第二个或第三个。这里发生了一些不寻常的事情,我无法弄清楚它是什么。

最佳答案

template<typename T, typename... Args>
inline String c(T a, Args... args)
{
return Ogre::StringConverter::toString( a ) + c(args...);
}

c 的非限定名称查找在 c(args...)在模板定义上下文中执行,这意味着它只查找 c 的重载声明到此为止,以后不会再找你c过载。 (ADL 是使用定义和实例化上下文执行的,但在您的情况下,它看起来好像没有 ADL。)

首先声明它们:

template<typename T, typename... Args>
inline String c(T a, Args... args);
template<typename... Args>
inline String c(String s, Args... args);
template<typename... Args>
inline String c( const char s[], Args... args);

在定义它们之前,以便可以找到所有三个重载。


顺便说一下,您不应该对单参数情况使用特化。删除 template<>并改用重载。如现在所写,U::c("");不会按照您希望的方式行事。

Demo .

关于c++ - Variadic 模板函数名称查找无法找到特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30226373/

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