簡體   English   中英

將模板類型參數作為模板非類型參數傳遞

[英]Passing template type parameter as a type of template non-type parameter

很好奇:在C ++ 17和更高版本中,我們可以對非類型模板參數使用auto占位符:

template<typename A, auto B>
class C {
public:
    A foo() { return B; }
};

但是我們可以傳遞而不是auto傳遞模板類型參數A嗎?

example.cpp

template<typename A, A B>
class C {
public:
    A foo() { return B; }
};

int main()
{
    C<int, 5> c;
    std::cout << c.foo() << std::endl;

    return 0;
}

在實踐中,我們可以做到這一點,並且-std = c ++ 11的clang允許這樣做。

$ g++ -std=c++11 example.cpp
$ ./a.out
5

但是標准呢? 我沒有為此找到任何明確的規則。 謝謝!

模板參數可以分為:

1. Type parameters
2. Non type parameters
3. Template template parameters

在您的情況下,語句AB是非類型模板參數,其類型為模板類型參數A

請記住,在您的示例中,您執行以下操作:

return B;

上面的聲明將在不可copy constructible類型A上失敗(這很容易用一個概念表示)。

請記住(如注釋中所指出),C ++ 17強制執行復制省略。

但是,我們可以傳遞而不是定義在左側的“自動”模板類型參數嗎?

當然。 這是舊的方式。

但是auto方式可以避免通過A型。

在C ++ 17中,您可以編寫

template <auto B>
class C {
public:
    auto foo() { return B; }
};

因此不需要傳遞A型。

我不知道在C ++ 11 / C ++ 14中也可以做到這一點。

我的意思是:如果需要,在C ++ 11 / C ++ 14中將值傳遞給模板...如果類型是固定的,則沒有問題

template <int I>

但是類型本身可以不同,在C ++ 11 / C ++ 14中,您必須先傳遞類型,然后傳遞值,如您的example.cpp

template <typename T, T A>

從舊的角度來看,問題在於,如果您要調用該類型的模板,則必須冗余並編寫一些內容,例如

C<decltype(x), x>  some_C_variable;

我知道避免這種冗余的唯一方法是通過make函數(例如make_tuple() )或C樣式宏。

在C ++ 17中,您可以簡單地編寫

C<x>   some_C_variable

並且,在C模板類/結構內部,可以從decltype(B)獲得x的類型。

對於C ++ 17標准參考...

首先,將auto定義為“ placeolder”

從10.1.7.4( auto說明符)開始,指向第1點

autodecltype(auto) 類型說明符用於指定占位符類型,該占位符類型將在以后通過初始化程序的推導來替換。

在C ++ 11 / C ++ 14中也是如此

但是C ++ 17標准在第4點枚舉中為“模板參數”(17.1)添加了新點4.6

  1. 非類型模板參數應具有以下(可選,具有cv限定)類型之一:

[...]

(4.6)包含占位符類型(10.1.7.4)的類型

暫無
暫無

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

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