我正在尝试做类似的事情:
#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()。
答案 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(){};
};
您还可以考虑创建一个公共基类以避免代码重复。