C++ 简化元组实现
我在一个没有任何标准库的平台上工作,我 尝试实现“类似元组”的类型 我只需要按类型获取工具,但我希望编译器 如果类型不存在,则发出C++ 简化元组实现,c++,c++11,C++,C++11,我在一个没有任何标准库的平台上工作,我 尝试实现“类似元组”的类型 我只需要按类型获取工具,但我希望编译器 如果类型不存在,则发出静态断言。没有必要断言 在重复的类型上,但这会很好 以下是我尝试过的: template<class... Args> struct SimpleTuple; template<> struct SimpleTuple<> { SimpleTuple() { } }; template<class Head, cl
静态断言。没有必要断言
在重复的类型上,但这会很好
以下是我尝试过的:
template<class... Args> struct SimpleTuple;
template<> struct SimpleTuple<> {
SimpleTuple() { }
};
template<class Head, class... Tail>
struct SimpleTuple<Head, Tail...> {
typedef Head HeadType;
typedef SimpleTuple<Tail...> VATailType;
SimpleTuple(Head head, Tail... tail) : data(head), rest(tail...) { }
// Does not compile, because explicit specialization in non-namespace
// scope is not allowed
template<typename T> T& get() {
return rest.get<T>();
}
template<> Head& get() {
return data;
}
Head data;
VATailType rest;
};
模板结构SimpleTuple;
模板结构SimpleTuple{
SimpleTuple(){}
};
模板
结构简单耦合{
头型;
typedef SimpleTuple-VATailType;
SimpleTuple(Head-Head,Tail…Tail):数据(Head),其余(Tail…{}
//不编译,因为非命名空间中的显式专门化
//范围是不允许的
模板T&get(){
返回rest.get();
}
模板头&get(){
返回数据;
}
头部数据;
瓦塔伊式休息;
};
我知道它为什么会失败,但我不知道如何避免这种限制
我正在寻找一个尽可能简单的实现方法。您可以使用SFINAE,根据类型T
是否与Head
相同,只让两个重载中的一个参与重载解析:
#include <type_traits> // For std::enable_if and std::is_same
template<typename T,
typename std::enable_if<!std::is_same<T, Head>::value>::type* = nullptr>
T& get() {
return rest.get<T>();
}
template<typename T,
typename std::enable_if<std::is_same<T, Head>::value>::type* = nullptr>
Head& get() {
return data;
}
这是一本书
对于与静态断言有关的内容,您可以定义一个简单的特征,用于检查给定的元组类型中是否存在给定的类型(该特征也可以根据std::conditional
定义,这也很容易实现):
并像这样使用它:
template<typename T,
typename enable_if<!is_same<T, Head>::value>::type* = nullptr>
T& get() {
static_assert(has_type<T, SimpleTuple>::value, "Type not found!");
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
return rest.get<T>();
}
template<typename T,
typename enable_if<!is_same<T, Head>::value>::type* = nullptr>
T& get() {
static_assert(has_unique_type<T, SimpleTuple>::value,
"Type not found or not unique!");
return rest.get<T>();
}
template::type*=nullptr>
T&get(){
静态断言(具有唯一的类型::值,
“找不到类型或类型不唯一!”);
返回rest.get();
}
这是一本书
template<typename T,
typename enable_if<!is_same<T, Head>::value>::type* = nullptr>
T& get() {
static_assert(has_type<T, SimpleTuple>::value, "Type not found!");
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
return rest.get<T>();
}
template<typename...> struct SimpleTuple;
template<typename T, typename U>
struct has_unique_type { static constexpr bool value = false; };
template<typename T, typename U, typename... Ts>
struct has_unique_type<T, SimpleTuple<U, Ts...>>
{
static constexpr bool value = has_unique_type<T, SimpleTuple<Ts...>>::value;
};
template<typename T, typename... Ts>
struct has_unique_type<T, SimpleTuple<T, Ts...>>
{
static constexpr bool value =
!has_unique_type<T, SimpleTuple<Ts...>>::value;
};
template<typename T>
struct has_unique_type<T, SimpleTuple<>>
{
static constexpr bool value = false;
};
template<typename T,
typename enable_if<!is_same<T, Head>::value>::type* = nullptr>
T& get() {
static_assert(has_unique_type<T, SimpleTuple>::value,
"Type not found or not unique!");
return rest.get<T>();
}