簡體   English   中英

具有模板構造函數(其他類型)的模板類

[英]templated class with templated constructor (of other type)

是否可以有一個模板化的類,並以其他類型來模板化構造函數?

像這樣的東西:

template<typename T1>
class Foo{
    template<typename T2>
    Foo(T1 aBar, T2 dummyArgument){
        bar = aBar;
        bytesOfT2 = sizeof(T2);
    };

    int bytesOfT2;
    T1 bar;
};

這可能嗎? 如果是這樣,我怎么稱呼這樣的構造函數? 我需要考慮一些有關頭文件和cpp文件的問題嗎?

謝謝!

// edit:我的特定示例實際上要復雜得多。 我有

template <typename U1, U2>
class Foo{
    U1 var1;
    U2 var2;
};

template <typename T1>
class Bar{
    template<typename T2, typename T3>
    Bar(Foo<T2,T3> aFoo, T1 aVal){
        val=aVal;
        bytesOfT2=sizeof(T2);
        bytesOfT3=sizeOf(T3);
    };

int bytesOfT2;
int bytesOfT3;
T1 val;
};

這是否意味着我可以在這里僅使用Foo類型的任何變量來調用構造函數,並且它應根據Foo的特定版本自動選擇適當的構造函數(例如,如果我傳遞的變量為Foo類型,則它應將T2自動設置為bool和T3浮動)?

是的,一個類模板可以具有一個構造函數模板。 您可以像調用其他任何構造函數一樣調用它:

Foo<int> my_foo(42, 0.0);

這將調用T1 = int (因為T1是類模板參數,而類模板參數是int )和T2 = double (因為T2是函數模板參數並從參數0.0推導)來構造函數模板。

必須能夠從函數參數中推導出所有模板參數,否則無法調用構造函數模板。 無法為構造函數模板明確指定模板參數。

是的,有可能。 至於調用構造函數,您只需提供一個T1類型的參數和另一個T2類型的參數。 就是這樣(除非有人進入有關“呼叫”的術語討論)。

順便說一句,而不是第一個默認初始化bar ,然后分配給它,你應該直接初始化它,像

template< class T2 >
Foo( T1 const& aBar, T2 const& dummyArgument )
    : bar( aBar )
    , bytesOfT2( sizeof( T2 ) )
{}

在C ++教科書中查找構造函數和初始化程序。

干杯,……

您還可以使用多種template type

template<typename T1, typename T2>
class Foo{
public:
    Foo(T1 aBar, T2 dummyArgument){
        bar = aBar;
        bytesOfT2 = sizeof(T2);
    }

private:
    int bytesOfT2;
    T1 bar;
};

暫無
暫無

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

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