如何使用接口从C ++中的模板强制通用数据类型?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用接口从C ++中的模板强制通用数据类型?相关的知识,希望对你有一定的参考价值。
[早上好,我已经搜索了一些东西,但找不到答案。我正在创建一个通用类,其想法是通用数据类型(类型名称T)应来自接口:
这是接口:
template<typename T> class iDataType{
public:
virtual bool writeOnFile(std::fstream& theFile,T& data) = 0;
virtual T readOnFile(std::fstream& theFile) = 0;
};
这就是我正在尝试做的事情:
template <typename T : public iDataType> class Database{};
谢谢您的时间。
答案
您可以使用static_assert
在编译时条件中声明,并且存在std::is_base_of
。
所以解决方案是:
template <typename T> class Database{
static_assert(std::is_base_of<iDataType<T>, T>::value, "should be derived from iDataType");
};
请注意,该解决方案适用于C ++ 11,对于更高版本的C ++ Standard,您可以使用std::is_base_of_v
和简洁的static_assert
(不带字符串文字参数)。
另一答案
T
在问题的有限上下文中源自iDataType<T>
的要求似乎并没有增加价值。但是,要回答我所解释的问题,您想要为真的属性是:
std::is_convertible_v<T*, iDataType<T>*>
std::is_base_of
具有误导性,因为它将回答T
是否具有iDataType<T>
的底数,但是该语言要求将T&
用作iDataType<T>&
的公共明确底数。因此,在C ++中,当您想知道某个东西是否具有基类作为接口时,std::is_base_of
是错误的。
以上是关于如何使用接口从C ++中的模板强制通用数据类型?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 System::^array 从 C# 函数转换为 C++ 中的等效数据类型