【发布时间】:2014-07-23 07:33:56
【问题描述】:
我想解压可变参数模板包并根据包中的每种类型选择特定的重载。
我有 3 个用于解包各种类型的重载:
// fixed size char arrays
template<size_t N, typename... Ts>
void unpack(const char (&)[N], Ts&&... ts);
// char pointers
template<typename... Ts>
void unpack(const char*, Ts&&... ts);
// all other types
template<typename T, typename... Ts>
void unpack(T&&, Ts&&... ts);
我将一个 char 数组 (char buf[1024]) 作为左值传递给可变参数构造函数。拆包时,T&&重载被选中。
如何选择const char (&)[N] 或const char* 重载?
示例应用:
#include <iostream>
struct foo
{
template<typename... Ts>
foo(Ts&&... ts)
{
unpack(std::forward<Ts>(ts)...);
}
template<size_t N, typename... Ts>
void unpack(const char (&)[N], Ts&&... ts)
{
std::cout << "const T (&)[N]" << std::endl;
unpack(std::forward<Ts>(ts)...);
}
template<typename... Ts>
void unpack(const char*, Ts&&... ts)
{
std::cout << "const char*" << std::endl;
unpack(std::forward<Ts>(ts)...);
}
template<typename T, typename... Ts>
void unpack(T&&, Ts&&... ts)
{
std::cout << "T&&" << std::endl;
unpack(std::forward<Ts>(ts)...);
}
void unpack()
{
}
};
int main()
{
char buf[1024];
const char* str = "foo";
foo f(buf, str);
return 0;
}
上面的代码会打印以下内容:
T&&
const char*
我希望它打印:
const T (&)[N]
const char*
或
const char*
const char*
即:选择两个字符重载之一 - 数组或指针。
【问题讨论】:
-
@Jarod42 我试过了!正是上面的问题让我问了上一个问题……问题不在于 char 数组和 char 指针之间的歧义——它选择了
T&&重载。 -
同样的解决方案也可能适用于这里:使用 SFINAE 来限制
T&&捕获的内容或对类使用专业化。 -
@Jarod42 - 是的,谢谢 - 我是从 @user657267 的回答中得到的 - 事实上
chars 不是const。
标签: c++ templates c++11 variadic-templates typetraits