【发布时间】:2021-03-10 09:11:13
【问题描述】:
我正在尝试创建一组函数,允许它们的调用者将运行时变量值转换为特定于编译时的等效项。就我而言,运行时变量是 Windows IInspectables,转换过程通常称为“拆箱”(尽管出于我的 C++ 问题的目的,这些细节只是说明性的)。我希望转换函数适用于标量(例如 bool、int、double)、容器(例如 optional、pair、tuple、vector)和容器组合(例如 vector
我知道可以通过输出参数的重载解析来表达所需的容器类型,例如
template<typename T1, typename T2>
void Unbox(/* in */ IInspectable* boxedValue, /* out */ std::pair<T1, T2>& unboxedValue)
template<typename T1, typename T2>
void Unbox(/* in */ IInspectable* boxedValue, /* out */ std::tuple<T1, T2>& unboxedValue)
是否可以通过返回值而不是输出参数来做同样的事情?我知道这是不正确/不可用的,但从概念上讲,我想定义……
template<typename T1, typename T2>
std::pair<T1, T2> Unbox(IInspectable* insp);
template<typename T1, typename T2>
std::tuple<T1, T2> Unbox(IInspectable* insp);
... 调用者控制是否创建一对或 2 元素元组。如果可能,实现这一目标的正确模式是什么?如果拆箱函数是(参数化)结构的(静态)方法,这是可以接受的。
【问题讨论】:
-
template<typename... Ts> std::tuple<Ts...> Unbox(IInspectable*);应该是可能的。如果你想要返回对/元组,问题是消除你的函数的歧义。 -
template<typename T> T Unbox(IInspectable*);并在函数内部进行调度,调用为Unbox<std::pair<bool, int>>。 -
在您的工作解决方案中,您负责选择您希望
boxedValue的拆箱方式,并通过提供适当类型的第二个参数来进行选择。在您想要的解决方案中,一个简单的问题是:谁/什么负责选择,如果不是您?您仍然需要让函数知道您想要输出什么。你可以通过提供一个模板参数来做到这一点,就像@super的第三个选项一样。我认为没有办法获得您想要的两个同名函数的签名。除非返回类型以某种方式依赖于IInspectable...
标签: c++ template-meta-programming