【发布时间】:2015-12-06 21:48:38
【问题描述】:
下面的例子是一个众所周知的习语的一个最小的例子,可能不是很好的例子。
它可以编译,但为了能够将其保持在最低限度,它是如此丑陋,因为问题不在于成语本身。
struct Foo {
virtual void fn() = 0;
};
template<class T>
struct Bar: public Foo {
void fn() override {
T{}.fn();
}
};
struct S {
void fn() { }
};
int main() {
Foo *foo = new Bar<S>{};
foo->fn();
}
从一个小时前开始,我一直在努力解决的是如何更改它(或者甚至,如果存在替代习语)以引入可变参数模板成员方法。
显然,我不能修改Foo 类的fn 函数,因为它是虚拟的,并且虚拟说明符不与模板一起使用。这同样适用于 Bar 的 fn 规范,因为它必须以某种方式覆盖基类中的规范。
注意。
因为我强烈怀疑这个问题可能是有史以来最大的XYProblem之一,我还想简要描述一下实际问题。
我有一个公开两个模板化成员方法的类:
第一个接受不立即使用的模板类
T,而是应该以某种方式存储以便以后使用。第二个接受可变数量的参数(它实际上是一个可变模板成员函数),并且这些参数应该完美地转发给新创建的
T实例。
嗯,这个问题要复杂得多,但这是一个很好的近似值,应该让您了解目标是什么。
编辑
我猜它在某种程度上类似于高阶函数。
我的意思是,解决问题的方法确实是绑定第一个参数的模板函数,但据我所知,这是不可能的以及我迄今为止探索过的任何其他方法。
任何表达相同概念的可行解决方案?
【问题讨论】:
-
您更大的目标是以一种我认为不可能的方式结合运行时和编译时的动态性,但我很想看看比我更聪明的人会想出什么。跨度>
-
@zwol 我也有同样的感觉,这就是我问的原因!! :-)
-
当然,成员函数模板不能是虚拟的
-
@A.S.H 我知道,我不想同时使用模板和虚拟说明符,而是希望目标明确(我的英语远非好,所以请告诉我如果问题不够清楚)。
-
我向你为解释你的目标所做的努力致敬,但我承认我看不到你到底在寻找什么。这根本不是英语的问题:)。充其量,我会去模板化基类本身,所以它可以有虚拟方法。但我不确定这是否能实现您的最终目标。
标签: c++ templates c++11 variadic-templates type-erasure