Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;模板转换函数_C++_Templates - Fatal编程技术网

C++ C++;模板转换函数

C++ C++;模板转换函数,c++,templates,C++,Templates,假设以下类型: enum class MyEnum1 {}; enum class MyEnum2 {}; typedef struct MyStruct1 {}; typedef struct MyStruct2 {}; 以及以下(愚蠢的)转换: MyEnum1 convert_to_MyEnum2(MyEnum2 e) { return MyEnum1(); } MyEnum2 convert_to_MyEnum1(MyEnum1 e) { return MyEnum2(); } MySt

假设以下类型:

enum class MyEnum1 {};
enum class MyEnum2 {};
typedef struct MyStruct1 {};
typedef struct MyStruct2 {};
以及以下(愚蠢的)转换:

MyEnum1 convert_to_MyEnum2(MyEnum2 e) { return MyEnum1(); }
MyEnum2 convert_to_MyEnum1(MyEnum1 e) { return MyEnum2(); }
MyStruct1 convert_to_MyStruct1(MyStruct2 s) { return MyStruct1(); }
MyStruct2 convert_to_MyStruct2(MyStruct1 s) { return MyStruct2(); }
我想要一个转换函数,它接受一个类型并将其转换为另一个类型

现在,由于函数总是接受一个不同的类型,并且不仅返回类型不同,我可以将所有的
convert\u to*
更改为
convert
,并用我所有的可能性重载此函数

但是,我不喜欢让用户编写以下内容:

auto e1 = convert(e2);
Foo(convert(e1));
//make all "convert" overloads private and only expose this function
template<typename To, typename From>
To convert_to(From from)
{
    return convert(from); 
}
我希望代码具有可读性,因此我考虑采用如下方式:

auto e1 = convert(e2);
Foo(convert(e1));
//make all "convert" overloads private and only expose this function
template<typename To, typename From>
To convert_to(From from)
{
    return convert(from); 
}
//将所有“convert”重载设为私有,并仅公开此函数
模板
将_转换为(从)
{
返回转换(从);
}
这样,代码将是:

auto e1 = convert_to<MyEnum1>(e2);
Foo(convert_to<MyEnum2>(e1));
autoe1=转换为(e2);
Foo(将_转换为(e1));
1-是否可以避免
convert
重载,但仍然使用某种单一入口点\单一函数名来实现我想要的功能?(即找到现有
的一些用法将\u转换为\u x


2-我知道这与代码审查更相关,但对此问题的建议方法(如果存在)是什么?

是的,可以使用一个名称实现覆盖多个类型的转换函数

enum类MyEnum1{};
枚举类MyEnum2{};
结构MyStruct1{};
结构MyStruct2{};
//未实施的一般退却案例。
//注意:有更文明的方式发布编译错误。。。
模板
将_转换为(From){return To::unimplemented_conversion;}
模板MyEnum1转换为(MyEnum2-from){return MyEnum1();}
模板MyEnum2 convert_to(MyEnum1 from){return MyEnum2();}
模板MyStruct1 convert_to(mystruct2from){return MyStruct1();}
模板MyStruct2 convert_to(MyStruct1 from){return MyStruct2();}
int main()
{
MyEnum2 e2=将_转换为(MyEnum1());
MyEnum1 e1=将_转换为(e2);
//MyStruct1 s1=convert_to(e2);未实现的转换
返回0;
}

是的,可以用一个名称实现覆盖多个类型的转换功能

enum类MyEnum1{};
枚举类MyEnum2{};
结构MyStruct1{};
结构MyStruct2{};
//未实施的一般退却案例。
//注意:有更文明的方式发布编译错误。。。
模板
将_转换为(From){return To::unimplemented_conversion;}
模板MyEnum1转换为(MyEnum2-from){return MyEnum1();}
模板MyEnum2 convert_to(MyEnum1 from){return MyEnum2();}
模板MyStruct1 convert_to(mystruct2from){return MyStruct1();}
模板MyStruct2 convert_to(MyStruct1 from){return MyStruct2();}
int main()
{
MyEnum2 e2=将_转换为(MyEnum1());
MyEnum1 e1=将_转换为(e2);
//MyStruct1 s1=convert_to(e2);未实现的转换
返回0;
}

<代码>什么是代码> Foo<代码>?BTW如果C++不存在“<代码> TyPulf< /Cube >前面的代码>结构代码<代码> >如果代码< > MyQue2>代码>但没有CTR,请使用<代码> MyMeNOT1/代码>您可以编写,那么用户不必为转换而添加任何额外的内容,不允许允许。如果是C++,则不需要对<代码> TyPulfF前面的代码> Stutt如果<代码> FoO 期望<代码> MyMeq2<代码>,但没有CTR,请使用“代码> MyMeNOT1/代码>您可以编写,那么用户就不必为转换而添加任何额外的内容,不希望允许隐式casts@ZivS你是说
static\u assert(false,…)
(no
std:
,它是一个关键字;
false
,因为
true
从不失败)?当然不是,即使不使用一般情况,也会导致编译失败。你完全正确,不知道我为什么添加了
std
。事实上,静态断言这种方式不会有帮助。不管怎样谢谢你的邀请answer@ZivS你是说
static\u assert(false,…)
(no
std:
,它是一个关键字;
false
,因为
true
从不失败)?当然不是,即使不使用一般情况,也会导致编译失败。你完全正确,不知道我为什么添加了
std
。事实上,静态断言这种方式不会有帮助。不管怎样,谢谢你的回答