【发布时间】:2016-11-16 07:37:18
【问题描述】:
基本上,我想让函数对向量(类型)参数和非向量类型参数的行为有所不同。
#include <vector>
using namespace std;
template <typename type>
struct is_vector {
static const bool value = false;
};
template <typename type>
struct is_vector<vector<type>>
{
static const bool value = true;
};
template <typename type>
type read()
{
if (is_vector<type>::value)
{
type vec(10);
vec.front()=1;//left of '.front' must have class/struct/union
return vec;
}
else
{
return{};
}
}
int main()
{
auto i= read<int>();
}
我想在使用vector作为类型名时返回一个向量,在使用int作为类型名时返回一个int。
但是由于 is_vector(int)::value 返回 false ,为什么我的编译器会报告“'.front' 的左侧必须有类/结构/联合”?我怎样才能使它工作?
我想要实现的是将字符串正确反序列化为 vector(type) 或 vector(vector(type)) 。
我需要递归调用 read 函数,同时传递一个多恶魔向量作为模板参数,但编译器禁止我这样做。
template <typename type>
struct is_vector {
static const bool value = false;
};
template <typename type>
struct is_vector<vector<type>>
{
static const bool value = true;
};
template <typename type>
type read(char*& str)
{
if (is_vector<type>::value)
{
type vec(read<uint8_t>(str));
for (auto& e : vec)
e = read<type::value_type>(str);
return vec;
}
return *reinterpret_cast<type*>((str += sizeof(type)) - sizeof(type));
}
所以我尝试了专业化。
template<>
vector<int> read<vector<int>>(char*& str)
{
vector<int> vec(read<uint8_t>(str));
for (auto& e : vec)
e = read<int>(str);
return vec;
}//works
template <typename type>
template <>
vector<type> read<vector<type>>(char*& str)
{
vector<type> vec(read<uint8_t>(str));
for (auto& e : vec)
e = read<type>(str);
return vec;
}//don't work
我真的需要为我使用的每一种类型手动重写我的读取函数吗?
(像向量(vector(vector(int)))?)
【问题讨论】:
-
您对向量的检查是运行时检查。该分支中的所有代码仍然必须是可编译的。
-
首先:
is_vector谓词在编译时进行评估。在 if 中使用它表明您没有完全理解应该使用什么模板。 -
@Albjenow 我对元编程了解不多,如何让我的函数为向量和 pod 类型生成不同的代码?
-
作为您问题的一种可能解决方案,您可能希望专门化
read函数:一个通用非向量变体,一个用于std::vector。 -
@Someprogrammerdude 谢谢。在非向量变体中,我只使用一个类型名,在向量变体中,我需要专门化向量并使用 T 作为它的 value_type ,所以这是两个类型名,如何实现这一目标?
标签: c++ grammar traits template-meta-programming