Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.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++;Aribitrary(动态)类型转换_C++_Templates - Fatal编程技术网

C++ C++;Aribitrary(动态)类型转换

C++ C++;Aribitrary(动态)类型转换,c++,templates,C++,Templates,我已经为两种类型A和B编写了一个适配器模式,该模式将适应这些类型。这只是一个普通的模板类。问题是我需要从A和B转换。虽然我不知道A和B的类型,但稍后将通过专门化来提供它们 有一种方法,允许通过告诉C++将来存在类型转换器,如果它不存在,则抛出一个错误,从任意A和B转换。(而不是仅仅假设无法转换) 例如: template<typename A, typename B> B Converter(A a) { return B(); } 模板B转换器(A){return B();}

我已经为两种类型A和B编写了一个适配器模式,该模式将适应这些类型。这只是一个普通的模板类。问题是我需要从A和B转换。虽然我不知道A和B的类型,但稍后将通过专门化来提供它们

有一种方法,允许通过告诉C++将来存在类型转换器,如果它不存在,则抛出一个错误,从任意A和B转换。(而不是仅仅假设无法转换)

例如:

template<typename A, typename B> B Converter(A a) { return B(); }
模板B转换器(A){return B();}
此转换器可用于任意类型,但显然不能正确转换。然后,我想具体说明:

template<> int Converter(int a) { return a/2; }
template<> float Converter(bool a) { return (a) ? 0.45f : 12f; }
template<> int Converter(myType a) { return a.value; }

then, later one, by the "user"(after compilation) I would like to effectively create more converters. For example, I will allow the user to hook into my code and supply converters for their custom types.
template int Converter(int a){返回a/2;}
模板浮点转换器(boola){return(a)→0.45f:12f;}
模板int转换器(myType a){返回a.value;}
然后,稍后,由“用户”(编译后)我想有效地创建更多的转换器。例如,我将允许用户连接到我的代码中,并为其自定义类型提供转换器。
我想我可以修改

template<typename A, typename B> B Converter(A a) { `Find appropriate converter in list and use that` }
模板B转换器(A){`在列表中找到合适的转换器并使用该`}
更为复杂,但我正在寻找一种有效的方法来做到这一点。事实上,我想允许使用多个相同类型的转换器:

template<> int Converter(int a) { return a/4; }
template int Converter(int a){返回a/4;}
(因此,在一种情况下,我将使用int-to-int转换器将值减半,在另一种情况下,我将使用a/4。我希望能够动态更改这些值。因此,我不会真正使用专门化)

我只想在编译时(我将编写一些)或运行时(用户将编写一些)插入类型转换器。我希望这些都是相当快的,我希望我写的转换器更快,因为他们是内置的


任何想法?

记住模板是纯编译时构造,C++不是动态代码,在运行时代码可以动态构建。@ JoaCHIMPILBORG是的,但是,我想提供静态模板转换。如果我不关心可扩展性,那么就不会有问题。我只需要在编译时编写所有转换,并使用上述方法。我想把两个世界结合起来。这应该不难,因为我应该能够以某种方式专门化编译时转换器,并“概括”动态转换器。正如我所指出的,通过专门化,然后在未指定的转换器中编写一个通用转换器,已经可以获得这一特性。问题是我还想以某种方式允许多个具有相同定义的转换器。e、 例如,
intmyconverter1(int),intmyconverter2(int)
。这也不难通过允许挂钩。。。但是整个方法效率相对较低。我想您可以使用额外的模板参数在几个相同的签名转换器之间进行选择。你能发布一段使用转换器的代码吗?我无法从你的问题中得出所需的使用语法。如果你希望不兼容的转换出现错误,就不要实现泛型。但是,这会干扰您的运行时选项。