【发布时间】:2015-09-08 20:17:47
【问题描述】:
假设以下情况:
- 有一个模板化接口,定义了对不同数据类型的一组操作。
- 此接口由定义实际数据类型操作的各种专用类实现。
- 有一些管理类必须处理 2 中定义的类实例。
简化的示例代码如下所示:
#include <iostream>
#include <type_traits>
template <typename R, typename S>
class ICanDoIt
{
public:
virtual void doStuff() = 0;
protected:
ICanDoIt<R, S>(R rA, S sA) : r(rA), s(sA) {};
R r;
S s;
};
class DoesIt : public ICanDoIt<int, double>
{
public:
DoesIt(int iA, double dA) : ICanDoIt(iA, dA) {};
virtual void doStuff()
{ std::cout << "r * s = " << r * s << " done." << std::endl; }
};
template <typename T>
class NeedsSomeoneWhoCanDoIt
{
static_assert(std::is_base_of<ICanDoIt<R, S>, T>::value,
"T needs to be able to do it.");
public:
NeedsSomeoneWhoCanDoIt(const T& doesItA) : doesIt(doesItA) {};
void getItDone() { doesIt.doStuff(); };
private:
T doesIt;
};
int main()
{
DoesIt doesIt(5, 2.2);
NeedsSomeoneWhoCanDoIt<DoesIt> needsIt(doesIt);
needsIt.getItDone();
}
如果您取消模板界面“ICanDoIt”,代码将真正起作用。但是模板化版本的 static_assert 会失败,因为 ICanDoIt 的模板参数被 DosIt 声明中执行的特化包装和隐藏。
如何将管理类 (NeedsSomeoneWhoCanDoIt) 模板参数“T”限制为 ICanDoIt 的任何 特化,无论在 ICanDoIt 特化期间为 R、S 选择了哪种类型? p>
【问题讨论】:
标签: c++ templates interface template-specialization typetraits