簡體   English   中英

專門化模板派生類的成員函數

[英]Specialize member function of a templated derived class

我有以下代碼(為了清楚起見,非常簡化):

class Base
{
    virtual int DoStuff(int arg) = 0;
};

template <typename T>
class Derived : public Base
{
    int DoStuff(int arg) override
    {
         // do some stuff
         return 0;
    }
};

這非常有效。 現在我想實現一個DoStuff的特殊(矢量化)實現。 我需要根據Derived的類型T來實現具體的實現,如下所示:

class Base
{
    virtual int DoStuff(int arg) = 0;
    virtual int DoStuffVectorized(int arg) = 0;
};

template <typename T>
class Derived : public Base
{
    int DoStuff(int arg) override
    {
         // do some stuff
         return 0;
    }

    int DoStuffVectorized<char>(int arg) override
    {
         // do some stuff for T == char
         return 0;
    }

    int DoStuffVectorized<int>(int arg) override
    {
         // do some stuff for T == int
         return 0;
    }
};

但是我無法完成這項工作。

編輯:我收到以下錯誤消息:錯誤C2143:語法錯誤:缺少';' 在行上的'<'之前, int DoStuffVectorized<char>(int arg) override

當我將其更改為: template<char> int DoStuffVectorized(int arg) override i get:error C2898:...':成員函數模板不能是虛擬的

關於如何實現這樣的事情的任何建議? 我需要它的原因是我有一個std :: vector存儲各種類型的數據(通過使用Derived <>)。 這樣我可以使用相同的簡單代碼,無論存儲的類型如何,即使使用DoStuff的特殊矢量化實現,我也希望這是真實的,這種實現很遺憾。

您必須在類之外專門化模板成員函數:

#include <iostream>

class Base
{
    public:
    virtual int DoStuffVectorized(int arg) = 0;
};

template <typename T>
class Derived : public Base
{
    public:
    int DoStuffVectorized(int arg) override;
};

template <>
int Derived<char>::DoStuffVectorized(int arg)
{
     std::cout <<  "T == char\n";
     return 0;
}

template <>
int Derived<int>::DoStuffVectorized(int arg)
{
     std::cout <<  "T == int\n";
     return 0;
}

int main(){
    Derived<char> c;
    Derived<int> i;
    Base* b[] = { &c, &i };
    for(auto* x : b)
        x->DoStuffVectorized(0);
    // undefined reference to `Derived<double>::DoStuffVectorized(int)'
    // Derived<double> d;
}

如果要在編譯時捕獲非預期的實例化:

#include <type_traits>

// A std::false_type (useful in a static_assert)
template <typename T>
struct static_false : std::false_type
{};

template <typename T>
int Derived<T>::DoStuffVectorized(int arg)
{
    static_assert(static_false<T>::value, "Neither 'char' or 'int'");
    return 0;
}

DoStuffVectorized<char>語法不正確, DoStuffVectorized不是模板本身。

請參閱模板專業化

template <typename T>
class Derived : public Base
{
    int DoStuff(int arg) override
    {
         // do some stuff
         return 0;
    }
    int DoStuffVectorized(int arg) override
    {
         // do some stuff (primary template)
         return 0;
    }
};

template <>
int Derived<int>::DoStuffVectorized(int) {
     // do some stuff for T == char
     return 0;
}

template <>
int Derived<char>::DoStuffVectorized(int) {
     // do some stuff for T == char
     return 0;
}

暫無
暫無

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

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