类定义中的条件

时间:2017-11-22 10:32:58

标签: c++ class oop templates conditional-statements

我正在尝试做类似的事情:

#pragma once
#include <memory>
#include <type_traits>
#include <vector>

class B{}

template <class T>
class A
{
    private:
        std::vector<std::shared_ptr<T>> ptrVector;
    public:
        A<T>();
        void pushBack(std::shared_ptr<T> t);
        if(std::is_same<T, B>::value)
        {
            void doSth();
        }
        ~A<T>(){};
};

甚至有可能以某种方式做这样的情况吗? 不,我不能从这个类继承,只有A<B>才需要doSth(),如果A<C>不存在doSth()。

2 个答案:

答案 0 :(得分:5)

您可以使用std::enable_if有条件地提供doSth,而无需专门化整个班级:

template <class T>
class A
{
    private:
        std::vector<std::shared_ptr<T>> ptrVector;
    public:
        A<T>();
        void pushBack(std::shared_ptr<T> t);    

        template <typename U = T>
        auto doSth() -> std::enable_if_t<std::is_same<U, B>::value>;     

        ~A<T>(){};
};

您需要template <typename U = T>,因为std::enable_if_t依赖于SFINAE。有关详细信息,请参阅std::enable_if to conditionally compile a member function

答案 1 :(得分:2)

您可以使用full specialization执行此操作。 e.g。

class B {};

template <class T>
class A
{
    private:
        std::vector<std::shared_ptr<T>> ptrVector;
    public:
        A();
        void pushBack(std::shared_ptr<T> t);
        ~A(){};
};

template <>
class A<B>
{
    private:
        std::vector<std::shared_ptr<B>> ptrVector;
    public:
        A();
        void pushBack(std::shared_ptr<B> t);
        void doSth();
        ~A(){};
};

您还可以考虑创建一个公共基类以避免代码重复。