【发布时间】:2015-07-25 10:08:30
【问题描述】:
我正在尝试编写一个字符串连接函数,该函数利用我的 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, "." )
返回
这是 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 ) 相匹配,会导致第一个参数被专用模板捕获,而不是第二个或第三个参数.这里发生了一些不寻常的事情,我无法弄清楚它是什么。
【问题讨论】:
-
名称查找问题。特别是,当定义第一个(通用)可变参数版本时,后面的两个重载不在作用域内,对
c的非限定查找将不会考虑它们。声明它们,然后定义它们。 -
顺便提一下,
String和const char *的单参数版本不应该是特化。
标签: c++ string templates c++11 variadic-templates