亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++編譯期循環(huán)獲取變量類型詳情

 更新時(shí)間:2022年09月09日 10:37:58   作者:ithiker  
這篇文章主要介紹了C++編譯期循環(huán)獲取變量類型詳情,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下

一、問(wèn)題

假設(shè)現(xiàn)在有一些屬性以及這些屬性對(duì)應(yīng)的數(shù)值類型,比如:

"gender" --> char
"age" --> int
"height" --> float
"IQ" ---> int
"name" --> std::string
"weight" --> double

在C++中,如何在編譯期依次循環(huán)獲取這些屬性的數(shù)值類型,并根據(jù)對(duì)應(yīng)的數(shù)值類型做出相應(yīng)的處理(屬性可能會(huì)增加)

二、解決方案

1.定義類型

首先把所有可能的類型用std::tuple列出:

using Types = std::tuple<float, int, double, std::string, char>;

template<std::size_t N>
using AttributeType = typename std::tuple_element<N, Types>::type;

這里,通過(guò)AttributeType<0>就可以得到float 類型

2.定義屬性集

將所有的屬性和其類型的對(duì)應(yīng)關(guān)系列出,由于需要是編譯期獲得,必須類似加入constexpr 關(guān)鍵字:

constexpr const char* FLOAT_TYPE = "float";
constexpr const char* INT_TYPE = "int";
constexpr const char* DOUBLE_TYPE = "double";
constexpr const char* STRING_TYPE = "std::string";
constexpr const char* CHAR_TYPE = "float";

constexpr std::array<std::pair<const char*, const char*>, 6> attribute2type = {{
    {"gender", CHAR_TYPE},
    {"age", INT_TYPE},
    {"height", FLOAT_TYPE},
    {"IQ", INT_TYPE},
    {"name", STRING_TYPE},
    {"weight", DOUBLE_TYPE},
}};

3. 獲取類型索引

根據(jù)2中定義的類型字符串,獲取1中需要的類型索引N:

constexpr std::size_t getTypeIndex(const char* name)
{
    return strings_equal(name, "float") ? 0:
        strings_equal(name, "int") ? 1:
        strings_equal(name, "double") ? 2:
        strings_equal(name, "std::string") ? 3:
        strings_equal(name, "char") ? 4:
        5; // compilation error
}

這里,需要一個(gè)編譯期進(jìn)行字符串比較的函數(shù):

constexpr bool strings_equal(const char* a, const char* b) {
    return *a == *b && (*a == '\0' || strings_equal(a + 1, b + 1));
}

4. 編譯期循環(huán)

如何實(shí)現(xiàn)編譯期的類似for循環(huán)呢,顯然不能直接用for,模板的特性決定了可以使用編譯期遞歸來(lái)進(jìn)行替代for循環(huán):

template <typename T>
void print(const char* attribute) {
    std::cout << "attribute = " << attribute << ",type=" <<  typeid(T).name() << std::endl;
}
constexpr size_t LAST_INDEX = attribute2type.size() - 1;
template <size_t T=LAST_INDEX>
struct PrintHelper {

    public:
        PrintHelper() {
            doPrint<T>();
        }
    private:
        template <size_t N>
        void doPrint() {
            print<AttributeType<getTypeIndex(std::get<N>(attribute2type).second)>>(std::get<N>(attribute2type).first);
            doPrint<N-1>();

        }

};
template <>
template <>
void PrintHelper<LAST_INDEX>::doPrint<0>() {
    print<AttributeType<getTypeIndex(std::get<0>(attribute2type).second)>>(std::get<0>(attribute2type).first);
}

將上面所有的代碼放到一塊,就得到了一個(gè)可以在編譯期循環(huán)獲取變量類型的程序:

#include <string>
#include <iostream>
#include <typeinfo>
#include <tuple>
#include <array>

using Types = std::tuple<float, int, double, std::string, char>;
template<std::size_t N>
using AttributeType = typename std::tuple_element<N, Types>::type;

constexpr bool strings_equal(const char* a, const char* b) {
    return *a == *b && (*a == '\0' || strings_equal(a + 1, b + 1));
}
constexpr std::size_t getTypeIndex(const char* name)
{
    return strings_equal(name, "float") ? 0:
        strings_equal(name, "int") ? 1:
        strings_equal(name, "double") ? 2:
        strings_equal(name, "std::string") ? 3:
        strings_equal(name, "char") ? 4:
        5; // compilation error
}
constexpr const char* FLOAT_TYPE = "float";
constexpr const char* INT_TYPE = "int";
constexpr const char* DOUBLE_TYPE = "double";
constexpr const char* STRING_TYPE = "std::string";
constexpr const char* CHAR_TYPE = "float";

constexpr std::array<std::pair<const char*, const char*>, 6> attribute2type = {{
    {"gender", CHAR_TYPE},
    {"age", INT_TYPE},
    {"height", FLOAT_TYPE},
    {"IQ", INT_TYPE},
    {"name", STRING_TYPE},
    {"weight", DOUBLE_TYPE},
}};

template <typename T>
void print(const char* attribute) {
    std::cout << "attribute = " << attribute << ",type=" <<  typeid(T).name() << std::endl;
}
constexpr size_t LAST_INDEX = attribute2type.size() - 1;

template <size_t T=LAST_INDEX>
struct PrintHelper {

    public:
        PrintHelper() {
            doPrint<T>();
        }
    private:
        template <size_t N>
        void doPrint() {
            print<AttributeType<getTypeIndex(std::get<N>(attribute2type).second)>>(std::get<N>(attribute2type).first);
            doPrint<N-1>();

        }

};
template <>
template <>
void PrintHelper<LAST_INDEX>::doPrint<0>() {
    print<AttributeType<getTypeIndex(std::get<0>(attribute2type).second)>>(std::get<0>(attribute2type).first);
}
int main() {
    PrintHelper<LAST_INDEX>();

    return 0;
}

上面程序輸出:

$ ./attributeWithType 
attribute = weight,type=d
attribute = name,type=NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
attribute = IQ,type=i
attribute = height,type=f
attribute = age,type=i
attribute = gender,type=f

總結(jié)

本文通過(guò)下面幾個(gè)技術(shù)點(diǎn)實(shí)現(xiàn)了編譯期循環(huán)獲取變量類型:

  • 通過(guò)std::tuple定義變量類型集合,
  • 通過(guò)typename std::tuple_element<N, Types>::type獲取某個(gè)變量類型
  • 通過(guò)編譯期遞歸實(shí)現(xiàn)編譯期字符串比較
  • 通過(guò)std::get(attribute2type)獲取屬性編譯期遞歸實(shí)現(xiàn)循環(huán)獲取變量類型 

到此這篇關(guān)于C++編譯期循環(huán)獲取變量類型詳情的文章就介紹到這了,更多相關(guān)C++循環(huán)獲取變量類型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用MinGW使Windows通過(guò)gcc實(shí)現(xiàn)C或C++程序本地編譯執(zhí)行的方法

    使用MinGW使Windows通過(guò)gcc實(shí)現(xiàn)C或C++程序本地編譯執(zhí)行的方法

    這篇文章主要介紹了使用MinGW使Windows通過(guò)gcc實(shí)現(xiàn)C或C++程序本地編譯執(zhí)行的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • 基于C語(yǔ)言實(shí)現(xiàn)三子棋游戲

    基于C語(yǔ)言實(shí)現(xiàn)三子棋游戲

    這篇文章主要為大家詳細(xì)介紹了基于C語(yǔ)言實(shí)現(xiàn)三子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • C++?Opencv實(shí)現(xiàn)錄制九宮格視頻

    C++?Opencv實(shí)現(xiàn)錄制九宮格視頻

    這篇文章主要為大家介紹了如何利用C++和OpenCV庫(kù)實(shí)現(xiàn)錄制九宮格視頻,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)OpenCV有一定幫助,感興趣的可以了解一下
    2022-05-05
  • 深入理解C/C++中的寫時(shí)拷貝

    深入理解C/C++中的寫時(shí)拷貝

    這篇文章主要給大家介紹了C/C++中寫時(shí)拷貝的相關(guān)資料,所謂寫時(shí)拷貝也就是拖延版的深拷貝,下面文章中介紹的非常清楚,需要的朋友可以參考學(xué)習(xí),下面來(lái)一起看看吧。
    2017-03-03
  • 排列和組合算法的實(shí)現(xiàn)方法_C語(yǔ)言經(jīng)典案例

    排列和組合算法的實(shí)現(xiàn)方法_C語(yǔ)言經(jīng)典案例

    下面小編就為大家?guī)?lái)一篇排列和組合算法的實(shí)現(xiàn)方法_C語(yǔ)言經(jīng)典案例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-09-09
  • C++模板template用法小結(jié)(推薦)

    C++模板template用法小結(jié)(推薦)

    這篇文章主要介紹了C++模板template用法總結(jié) ,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • 詳解C++17中的decltype類型推導(dǎo)

    詳解C++17中的decltype類型推導(dǎo)

    這篇文章主要介紹了C++17中的decltype類型推導(dǎo),本文從泛型編程中經(jīng)常會(huì)遇到2個(gè)常見(jiàn)問(wèn)題入手,循序漸進(jìn)的分析了從C++11開(kāi)始引入的關(guān)鍵字decltype,需要的朋友可以參考下
    2023-06-06
  • C++?如何使用棧求解中綴、后綴表達(dá)式的值

    C++?如何使用棧求解中綴、后綴表達(dá)式的值

    這篇文章主要介紹了C++?使用棧求解中綴、后綴表達(dá)式的值,本文講解了中綴、后綴表達(dá)式的求值過(guò)程以及如何將一個(gè)中綴表達(dá)式轉(zhuǎn)換成后綴表達(dá)式,需要的朋友可以參考下
    2022-10-10
  • C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之鏈隊(duì)列的基本操作

    C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之鏈隊(duì)列的基本操作

    這篇文章主要為大家介紹了C語(yǔ)言之鏈隊(duì)列的基本操作,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-12-12
  • C語(yǔ)言編程中分配內(nèi)存空間的相關(guān)函數(shù)

    C語(yǔ)言編程中分配內(nèi)存空間的相關(guān)函數(shù)

    這篇文章主要介紹了C語(yǔ)言編程中分配內(nèi)存空間的相關(guān)函數(shù),分別是malloc()函數(shù)和calloc()函數(shù),需要的朋友可以參考下
    2015-08-08

最新評(píng)論