C++标准模板(STL)- 类型支持 (杂项变换,基于编译时布尔值选择一个类型或另一个,std::conditional)

类型特性

类型特性定义一个编译时基于模板的结构,以查询或修改类型的属性。

试图特化定义于 <type_traits> 头文件的模板导致未定义行为,除了 std::common_type 可依照其所描述特化。

定义于<type_traits>头文件的模板可以用不完整类型实例化,除非另外有指定,尽管通常禁止以不完整类型实例化标准库模板。
 

杂项变换

基于编译时布尔值选择一个类型或另一个

std::conditional

template< bool B, class T, class F >
struct conditional;

(C++11 起)

提供成员 typedef type ,若 B 在编译时为 true 则定义为 T ,或若 B 为 false 则定义为 F

成员类型

成员类型 定义
type 若 B == true 则为 T ,若 B == false 则为 F

辅助类型

template< bool B, class T, class F >
using conditional_t = typename conditional<B,T,F>::type;

(C++14 起)

可能的实现

template<bool B, class T, class F>
struct conditional { typedef T type; };
 
template<class T, class F>
struct conditional<false, T, F> { typedef F type; };

调用示例

#include <iostream>
#include <type_traits>
#include <typeinfo>

struct A
{
};

struct B
{
};

int main()
{
    typedef std::conditional<true, int, double>::type Type1;
    typedef std::conditional<false, int, double>::type Type2;
    typedef std::conditional<sizeof(int) >= sizeof(double), int, double >::type Type3;
    typedef std::conditional<false, A, B>::type Type4;
    typedef std::conditional<true, std::string, char*>::type Type5;

    std::cout << "std::conditional<true, int, double>::type:    "
              << typeid(Type1).name() << std::endl;
    std::cout << "std::conditional<false, int, double>::type:   "
              << typeid(Type2).name() << std::endl;
    std::cout << "std::conditional<sizeof(int)>=sizeof(double),int,double>::type:"
              << typeid(Type3).name() << std::endl;
    std::cout << "std::conditional<false, A, B>::type:          "
              << typeid(Type4).name() << std::endl;
    std::cout << "std::conditional<true, std::string, char*>::type: "
              << typeid(Type5).name() << std::endl;
    return 0;
}

输出

std::conditional<true, int, double>::type:    i
std::conditional<false, int, double>::type:   d
std::conditional<sizeof(int)>=sizeof(double),int,double>::type:d
std::conditional<false, A, B>::type:          1B
std::conditional<true, std::string, char*>::type: NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE

猜你喜欢

转载自blog.csdn.net/qq_40788199/article/details/134751385
今日推荐