【发布时间】:2013-04-28 11:17:08
【问题描述】:
是否可以在运行时确定类型的方法返回不同类型的值?
我正在编写一些可以使用不同密码进行编码和解码的东西。每个密码都有一个不同类型的密钥,在某个阶段我需要允许密码获取此密钥。
为了避免编写三个(目前有三个密码)单独的方法来返回不同类型的密钥,并且一次只使用一个密码,我尝试执行以下操作:
在parser.h:
template <typename T>
T get_key(void) const;
在parser.cpp:
/**
* The key to be used for encoding or decoding.
*
* @return The key to be used.
*/
template <typename T>
T cmdline_parser::get_key(void) const
{
if (vm.count("xor") > 0)// if xor cipher in use
return vm["xor"].as<long>();// returns a key of type long
else if (vm.count("caesar") > 0)// if caesar cipher in use
return vm["caesar"].as<int>();// returns a key of type int
else// vignere cipher in use
return vm["vignere"].as<std::string>();// returns a key of type std::string
}
我是如何尝试使用它的:
Crypt<VignereCipher, std::string, Group, Pack> c(parser.get_key());
使用clang++ 编译得到:
main.cpp:42:61: error: no matching member function for call to 'get_key'
Crypt<VignereCipher, std::string, Group, Pack> c(parser.get_key());
~~~~~~~^~~~~~~
和
./cmdline_parser.h:40:7: note: candidate template ignored: couldn't infer template argument 'T'
T get_key(void) const;
^
【问题讨论】:
-
函数没有参数,编译器无法从任何地方推断出类型。
-
您听说过变体类型吗?该变体将解决您的问题。
-
听起来像是多态类层次结构和工厂的经典案例。
-
vm是什么set? -
@AnatolyS 我从未听说过变体类型? @jrok vm 是
boost::program_options::variables_map
标签: c++ function templates generics