C++ 可变参数函数模板

3

对我来说,可变模板的概念相当令人困惑,我希望能够让它变得更加复杂(好吧,我认为……)。
让我们考虑以下代码:

template <typename T>
class base  
{  
    template <typename... E>  
    virtual void variadic_method_here(E... args) = 0;  
};

一个实现类:

class derive : public base<some_object> 
{  
    void variadic_method_here(concrete_args_here);  
};

我该怎么做呢?


8
据我所知,模板无法是虚拟的,无论是否具有可变参数。 - UncleBens
@pmr - 我不知道我可以这样做。我几乎从不阅读常见问题解答和入门指南。谢谢 =) - Royi Freifeld
1
@RoyiFreifeld 这也许可以解释为什么你试图做一些语言所禁止的事情。 :) - pmr
@pmr - 哦,那只是缺乏知识,或者需要使用C++的这个“黑暗面”。 - Royi Freifeld
2个回答

4

如果我面临这个问题,我会使用CRTP和重载来解决它。

例如:

#include <iostream>

template <typename Impl>
class base {
public:
   template <typename... E>
   void foo(E... args) {
      Impl::foo_real(args...);
   }
};

class derived : public base<derived> {
public:
   static void foo_real(double, double) {
     std::cout << "Two doubles" << std::endl;
   }

   static void foo_real(char) {
     std::cout << "Char" << std::endl;
   }
};

int main() {
  derived bar;
  bar.foo(1.0,1.0);
  bar.foo('h');
}

1
这仍然留下了运行时多态性的问题,OP显然正在追求。 - pmr
3
他们没有明确要求运行时多态性——在我看来,他们似乎想要编译时多态性,但不知道CRTP。 - Flexo
1
你可能是对的。OP 代码中的 virtual 可能是一个不太自觉的决定。 - pmr
@awoodland - 你说得对。我从未听说过CRTP,它听起来像一个好主意,但我仍然不确定它是否能解决我的问题。 派生类可能会根据我应用程序GUI上的一些点击来决定。 如果我有两个或更多的派生类,它还能工作吗? - Royi Freifeld
@RoyiFreifeld - 听起来你要运行时多态,如果在你的应用程序中使用了多个派生类。template virtual 函数的问题在于编译器如何决定为哪些类型进行实例化?不能假设编译器在看到调用的位置和它实现的位置在同一个翻译单元中,因此对于派生类实例化哪些变量而言,对于编译器来说是不可能的(通常)。 - Flexo
@awoodland - 让我尝试更好地解释一下:我有一个单一的基指针。构建将在运行时发生,但仍然只有一个。如果您喜欢,就像Strategy/State设计模式一样。这就是为什么我使用了虚拟关键字的原因。 - Royi Freifeld

4

你不能拥有一个模板虚函数。


1
匿名的踩贴者:请始终说明您为什么要踩贴。我必须猜测您认为(错误地)这并没有回答OP的问题。它肯定是正确的,并且直接涉及到OP的代码。我大多数退出在SO上帮助人们的原因之一就是这个地方演变成了网络上第一位Herb Schildt网站。而这其中一个主要原因,我认为,是像你这样的随意或社交性的踩贴。技术讨论不是民主制。除了在SO上,投票不能胜过逻辑或事实。 - Cheers and hth. - Alf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接