无论如何,我可以确定构造函数是否存在吗?

Is there anyway that I can determine whether the construct function is exist?

本文关键字:是否 存在 构造函数 我可以 无论如何      更新时间:2023-10-16
#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 标准中的概念