如何使用接口从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 ++中的模板强制通用数据类型?的主要内容,如果未能解决你的问题,请参考以下文章

如何从INTERVAL类型转换为NUMBER类型

如何将 System::^array 从 C# 函数转换为 C++ 中的等效数据类型

C-Numpy:如何从现有数据创建固定宽度的字符串数组

如何使用Qt和C ++的“接口类”来传递两个线程

如何使用 c++/cli 从 C# 流到 OpenCV Mat?

如何使用方法写入通用数组?指定类型后,通用数组不会更改数据类型