专门针对某些类型的模板类

问题描述 投票:0回答:1

如何使用 is_trivial 为普通类型制作模板专门化?同时,指针也是微不足道的,但应该为它们保留单独的专业化。 我正在使用 c++11。

#include <string>
#include <iostream>
#include <type_traits>
#include <vector>
#define Work(var)     A<decltype(var)>().print(&var);

//Base class
class ABase{
    public:
    virtual void print(void* ptr)=0;
};
//default template
template <class T> 
class A : public ABase{
    public:
    void print(void* ptr) override {
        std::cout<<"default "<<ptr<<" size:"<<sizeof(T)<<std::endl;
    }
};
// template for pointers
template <class T> 
class A<T*> : public ABase{
    public:
    void print(void* ptr) override {
        std::cout<<"pointer "<<ptr<<" content:"<<std::endl;
        T* val=static_cast<T*>(ptr);
        Work(*val);
    }
};
// template for arrays
template <class T, std::size_t N> 
class A<T[N]> : public ABase{
    public:
    void print(void* ptr) override {
        std::cout<<"array "<<ptr<<" size:"<<sizeof(T[N])<<" count:"<<N<<std::endl;
    }
};
// template for is_trivial    HOW?
template <> 
class A<int>: public ABase{  // MUST BE FOR ALL TYPES using std::is_trivial<T>::value
    typedef int T;
    public:
    void print(void* ptr) override {
        char* d= static_cast<char*>(ptr);
        std::cout<<"trivial "<<ptr<<" size:"<<sizeof(T)<<" dump:";
        for(int i=0; i<sizeof(T); i++)
            std::cout<<std::hex<<d[i];
        std::cout<<std::endl;
    }
};

int main(){
    int x=10;
    Work(x);
    char c[5]="qwe";
    Work(c);
    char* str= &c[1];
    Work(str);   
}

我看到了函数是如何完成此操作的,但是函数头中有一个模板数据类型,它简化了一切

c++ templates metaprogramming template-specialization
1个回答
0
投票

您可以使用

std::is_fundamental
,如下所示。请注意,具有默认值的第二个类型参数已添加到主模板中,以使其正常工作:

//-----------------vvvvvvvvvvvvvvvv--------->added second parameter with default
template <class T, typename = void> 
class A : public ABase{
    public:
    void print(void* ptr) override {
        std::cout<<"default "<<ptr<<" size:"<<sizeof(T)<<std::endl;
    }
};
//specialization for fundamental types
template <typename C> 
class A<C, std::enable_if_t<std::is_fundamental_v<C>>>: public ABase{ 
    
};

工作演示

© www.soinside.com 2019 - 2024. All rights reserved.