专门化模板派生类的成员函数

彼得·克

我有以下代码(为清楚起见非常简化):

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的特殊(矢量化)实现。我需要根据派生的类型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我得到:错误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;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

模板类-成员函数专门化

来自分类Dev

模板类-成员函数专门化

来自分类Dev

如何专门化模板类成员函数?

来自分类Dev

C ++-部分专门化模板类成员函数

来自分类Dev

类模板特殊成员函数显式专门化

来自分类Dev

C ++-专门化类模板的成员函数

来自分类Dev

如何专门化模板成员函数?

来自分类Dev

模板成员函数专门化

来自分类Dev

模板专门化不适用于派生类

来自分类Dev

将std :: hash专门化到派生类

来自分类Dev

如何在模板类中专门化模板成员函数?

来自分类Dev

如何专门化模板类中的模板成员函数(已指定)?

来自分类Dev

在类中使用成员类模板专门化

来自分类Dev

显式模板专门化不能具有存储类-成员方法专门化

来自分类Dev

类模板专门化,仅更改一个成员函数

来自分类Dev

使用当前类专门化继承的模板化函数

来自分类Dev

模板成员变量专门化

来自分类Dev

如何部分专门化非模板类的模板成员方法?

来自分类Dev

在派生类中绑定非静态模板成员函数

来自分类Dev

派生类的成员函数

来自分类Dev

C ++模板和派生类成员初始化

来自分类Dev

如何专门化具有指向成员参数的指针的模板类?

来自分类Dev

在模板化类中专门化模板化结构

来自分类Dev

在msvc而非其他上编译的模板成员函数专门化的情况

来自分类Dev

在msvc而非其他上编译的模板成员函数专门化的情况

来自分类Dev

如何使用模板模板参数专门化类模板?

来自分类Dev

使用类模板的内部类模板专门化模板

来自分类Dev

将派生类传递给专门用于基类的模板函数

来自分类Dev

将派生类传递给专门用于基类的模板函数

Related 相关文章

热门标签

归档