簡體   English   中英

構造函數的部分模板特化

[英]Partial template specialization for constructor

我需要一個看起來像這樣的 class:

template<typename T, class S, size_t C>
class myClass
{
public:
    myClass(); // Ctor

    /*


    */
private:
S myData;
}

其中 T 是存儲數據的類型,S 是容器類型,C 是它的大小。 方法不依賴於容器類型,但我仍然需要正確初始化 S。例如,讓 S 為std::vector ,我試過:

template<typename T, size_t C>
myClass<T, std::vector<T>, C>::myClass()
{

}

但我收到E0040 expected identifier錯誤。

您不能部分專門化一個方法,您可以部分專門化整個 class,但需要一些重復。

由於您可以使用 C++17,因此您可以調整實現:

template<typename T, class S, size_t C>
myClass<T, S, C>::myClass()
{
    if constexpr (std::is_same_v<S, std::vector<T>>) {
        // special case
    } else {
        // regular case
    }
}

在另一個選項(C++ 17 之前)中標記 dipatching,其優點是允許成員初始化器列表:

template <typename T> struct tag{}; 

template <typename T, class S, size_t C>
class myClass
{
private:
    myClass(tag<std::vector<T>>) : myData(/*special case */) {/* special case */}

    template <typename U>
    myClass(tag<U>) : myData(/*regular case */) {/* regular case */}

public:
    myClass() : myClass(tag<S>{}) {}

private:
    S myData;
};

暫無
暫無

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

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