簡體   English   中英

class 模板中的模板構造函數

[英]Template constructor in a class template

我有一個例子:

#include <iostream>
#include <type_traits>
template<typename T>
struct A{
    A([[maybe_unused]]T t){std::cout<<"contructor 1";}
    template<typename X>
    A([[maybe_unused]]X x1,[[maybe_unused]]X x2){
        std::cout<<std::boolalpha;
        std::cout<<std::is_same_v<decltype(x1),int><<std::endl;
        std::cout<<"contructor 2"<<std::endl;
        std::cout<<x1<<" "<<x2<<std::endl;
    }
};
int main()
{
    int ax=3;
    [[maybe_unused]]A<char> a(ax,ax);
}

這將打印出來

false
contructor 2
3 3

但是我不明白為什么我應該有一個 class 構造函數模板。 而且無論class模板類型是什么,結果都是不變的。 任何人都可以解釋這個概念的原因。

此代碼肯定僅用於學習目的,因此我假設您通常會問模板化 class 中的模板化構造函數有什么樣的用例。

這種模式的一個很好的例子出現在沒有 inheritance 的類型擦除的常見實現中。請參見此處的示例:

C++ 技術:類型擦除與純多態

這是一個相當高級的模式,但非常有趣。

順便說一句 - 在你的具體情況下你寫了

無論class模板類型是什么,結果都不變

但是如果你把 ax 的類型改成 short,它就會改變:

short ax = 3;

因為打印將參數類型(而不是 class 模板類型)與int進行比較。

暫無
暫無

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

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