无论如何,我可以确定构造函数是否存在吗?
Is there anyway that I can determine whether the construct function is exist?
#include <iostream>
template<typename _OutType, typename _InType>
struct ConvertClass
{
_OutType operator()(_InType src)
{
return _OutType(src);
}
};
class OutClass
{
public:
OutClass(std::string str)
{
std::cout << "construct function works well!" << std::endl;
}
};
int main()
{
ConvertClass<OutClass, int>()(20); // this is wrong, because the OutClass only have one construct which takes the std::string type parameter.
// ConvertClass<OutClass, std::string>()(std::string("Hello!"));
/*
if (...) // So I wonder if there is any way that we can know whether the construct function is exists or not before we call the OutClass(int i) function
{
std::cout << "there is no such construct function of OutClass to take that parameter type" << std::endl;
return -1;
}
else
{
std::cout << "construct function works well!" << std::endl;
return 0;
}
*/
}
我的问题: 我知道主函数肯定是错误的,因为OutClass没有构造函数OutClass(string str(。 我想知道是否有办法只更改注释 1 部分,模板类可以使该文件成功编译和链接。
我的英语不好,希望你们不要介意! 谢谢!
据我所知,没有运行时检查给定类是否可以使用给定类型的参数构造 正如我在之前的回答中所说,您可以求助于 Concepts 并在编译时检查类型,但如果子句在编译时不起作用 对我来说,看起来最好的解决方案确实是从OutClass中创建一个模板类,然后你有一个单一的类,可以有多种用途,这取决于你的需要
再编辑一次代码,我看到您将_OutType和_InType传递给您的模板。
在我们有以下类模板的环境中
template<class srcType>
class OutType:{
srcType src;
public:
OutType(srcType src) : src(src) {std::cout << "constructor works well!" << std::endl;}
}
然后在调用类 ConvertClass 时:
auto val = ConvertClass<OutClass<std::string>, std::string>()(std::string("Hello!"));
这也将起作用:
auto val = ConvertClass<OutClass<int>, int>(20);
但是,由于 operator(( 不是静态方法,因此您首先需要构造类 ConvertClass 的对象
在 c++20 甚至 c++17 中,您实际上可以从 int 检查 OutClass 是否可以构造: 所以你的 if 子句应该看起来像这样
if(std::is_constructible<OutClass, int>::value) {
std::cout << "all is well" << std::endl;
}else{
std::cout << "you can't construct OutClass from int" << std::endl;
}
您可以从OutClass创建以下类模板
template<class SrcType>
class OutClass {
SrcType src;
public:
OutClass(SrcType src) : src(src) {}
}
然后在您的代码中
return OutType<InType>(src);
如果您需要检查作为模板参数传递的类实际上可以做什么(如果它们是算术或加法或复制可构造的,例如(,请使用 C++20 标准中的概念
相关文章:
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 如何检查QList中是否存在值
- 根据某个函数是否存在启用模板
- 地图计数确实很重要,或者只是检查是否存在
- C++中是否存在 std::conditional 的懒惰等价物?
- 无论如何,我可以确定构造函数是否存在吗?
- COM :是否可以查看是否存在对我的某个 COM 对象的进程外引用?我可以释放它吗?
- 堆分配的对象是否存在永不为空的唯一所有者?
- 扩展类中的可选 vir 函数,测试它在运行时是否存在
- 模板化检查是否存在带有参数列表的类成员函数?
- 是否存在包含负号的isdigit函数(过载)
- 如何巧妙地编写两个函数——一个用于检查是否存在解决方案,另一个用于获取所有解决方案
- 检查编译时是否存在静态函数
- 向量是否存在行主要形式?
- 检查 TinyXML 中的元素是否存在
- 检测是否存在具有 C++17 的类成员
- 虚拟继承中是否存在多重继承?
- 我遇到了这个代码片段,不明白. 它递归检查 C++ 字符串中是否存在大写字符
- std::weak_ptr 和相应的 std::shared_ptr 之间是否存在数据竞争?
- 是否存在用于 C 或 C++ 中常见数学运算(例如最小值、最大值和平均值)的可导入库?