Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 简化元组实现_C++_C++11 - Fatal编程技术网

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>();
}