簡體   English   中英

如何在c ++中使用嵌套模板?

[英]How do I use nested templates in c++?

我是C ++的新手,現在正在上課。 作為家庭作業,我們應該編寫一個函數,接受任何容器作為輸入,但不使用迭代器。 因此我們不允許將std::begin(container)std::end(container)作為參數傳遞。 我們必須將容器作為引用傳遞。 我對此的看法是以下函數聲明:

template <typename T, typename U, typename V, template <typename a, typename b> typename container>
void doStuff(container<T, U>& first, container<T, V>& second)
{
    // the code
}

它接受兩個容器(或任何使用兩個模板參數的模板化類型)。 container的第二個模板參數是不同的,因為在數組V可能表示數組的大小,我希望能夠接受兩個不同大小的數組。

例:

std::array<bool, 4> a1 = { true, false, false, false };
std::array<bool, 1> a2 = { false };

不幸的是,這個例子不起作用。 錯誤說我doStuff不接受這些類型的參數。 這是為什么?

在我看來,在這里使用“模板化模板”很重要,因為我想確保該函數只接受兩個容器,如果它們包含相同類型的數據。 所以傳遞一個int數組和一個double數組應該不起作用。

如果要支持盡可能多的容器類型,則應盡可能使用限制最少的定義:

template <typename FirstContainer, typename SecondContainer>
void doStuff(FirstContainer& first, SecondContainer& second)
{
}

這是因為容器類型有各種各樣的風格,例如std::array是一個采用值類型和靜態大小作為參數的模板, std::vector是一個采用值類型和分配器的模板,一些自定義StringList可能根本不是模板。

您的實現可能對受支持的容器有一些特定要求,例如它可能僅適用於整數類型的容器。 但這往往只是實施的隱含結果。 舉一個簡單的函數來總結兩個容器的值:

template <typename FirstContainer, typename SecondContainer>
int sum(const FirstContainer& first, const SecondContainer& second)
{
    int result = 0;
    for (auto value : first)
        result += value;
    for (auto value : second)
        result += value;
    return result;
}

此函數適用於可添加到整數的任何值類型。 如果無法添加(如std::string ),最終會導致編譯錯誤。

(注意,可以使用自動推導的sum類型而不僅僅是int來編寫此函數更通用)

如果這些“隱式需求”對您來說還不夠,可以使用static_assert添加顯式檢查:

template <typename FirstContainer, typename SecondContainer>
int sum(const FirstContainer& first, const SecondContainer& second)
{
    int result = 0;
    for (auto value : first)
    {
        static_assert(std::is_same_v<int, decltype(value)>, "FirstContainer does not hold integers");
        result += value;
    }
    for (auto value : second)
    {
        static_assert(std::is_same_v<int, decltype(value)>, "SecondContainer does not hold integers");
        result += value;
    }
    return result;
}

現在你的函數只接受包含普通int容器,沒有別的。

您還可以使用std::enable_if為不受支持的容器完全“禁用”您的函數:

template <typename FirstContainer, typename SecondContainer>
auto sum(const FirstContainer& first, const SecondContainer& second)
    -> std::enable_if_t<
        std::is_same_v<typename FirstContainer::value_type, int> &&
        std::is_same_v<typename SecondContainer::value_type, int>,
        int
    >
{
    int result = 0;
    for (auto value : first)
        result += value;
    for (auto value : second)
        result += value;
    return result;
}

現在,您的函數僅限於具有嵌套typedef value_type容器,以鍵入int

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM