【发布时间】:2021-04-08 15:27:30
【问题描述】:
我正在尝试创建一个模板化函数,它根据给定的函数参数返回一些内容,目标是让函数在运行时找出它需要返回的内容。以如下代码为例:
// foo.h
#pragma once
class foo
{
public:
enum type {
ALPHA,
BETA
};
enum version {
ONE,
TWO
};
foo(type t, version v) : m_type(t), m_version(v) {};
type get_type() { return m_type; }
version get_version() { return m_version; }
template<typename T>
T get_either(bool type);
private:
type m_type;
version m_version;
};
// foo.cpp
#include "foo.h"
template<typename T>
T foo::get_either(bool type) {
if (type) {
return get_type();
}
else {
return get_version();
}
}
// main.cpp
int main()
{
foo a(foo::type::ALPHA, foo::version::ONE);
a.get_type();
a.get_version();
a.get_either(true);
^^^^^ compiler error
}
这显然会因编译器错误而失败,但这甚至可能吗?在我的一生中,我无法弄清楚如何做到这一点,而且我真的很挣扎,甚至在模板的世界中从哪里开始。
编辑:我可能应该更好地解释我的用例,请参见下图。我首先想看看我是否可以通过提示自己得到它,而不是让别人帮我弄清楚。
我将有一个vector 的接口类。我想遍历这个列表,并调用get_sensor() 来检索投射到派生类的传感器。我现在通过检查传感器的type,然后将dynamic_casting 到它需要的任何派生类来“手动”执行此操作,但我想知道这是否可以通过variant 自动完成。
【问题讨论】:
-
你不能有多个具有相同签名的函数,只有返回类型不同。
-
使用
std::variant? -
您的用例是什么? (std::variant 有效,或者作为 Marek R 的答案,函数重载。)
-
@Devolus 请看我更新的问题,这不能用
variant或any解决吗? @Someprogrammerdude 我看了variant并进行了一些实验,但我不确定是否有可能实现我想要的,请参阅我更新的问题。 @Unapiedra 我更新了我的问题。