【问题标题】:Templated Barton and Nackman Trick Problems模板化的 Barton 和 Nackman 技巧问题
【发布时间】:2009-06-05 05:39:15
【问题描述】:

我正在尝试使用 Barton 和 Nackman 技巧来实现类以避免动态调度。 (我正在编写性能很重要的 MCMC 代码。)我不是 C++ 专家,但基本技巧在其他地方对我有用。但是,我现在遇到了需要对第二个派生类进行模板化的情况。这似乎会引起问题。我的代码大纲是:

// Generic step class
template<class DerivedStepType>
class Step {
public:
  DerivedStepType& as_derived() {
    return static_cast<DerivedStepType&>(*this);
  }

  void DoStep() {
    return as_derived.DoStep();
  }
};

// Gibbs step
template<class DerivedParameterType> // THIS IS THE PROBLEM
class GibbsStep : public Step<GibbsStep> {
public:
  GibbsStep(DerivedParameterType new_parameter) {
  }
  void DoStep() {
  }
};

问题是template&lt;class DerivedParameterType&gt; 和下面的&lt;GibbsStep&gt;(来自 Barton 和 Nackman 的把戏)。使用 g++ v 4.01 (OSX),我得到以下错误:

./src/mcmc.h:247: error: type/value mismatch at argument 1
 in template parameter list for 'template<class DerivedStepType> class Step'
./src/mcmc.h:247: error:   expected a type, got 'GibbsStep'

如果删除 template&lt;class DerivedParameterType&gt; 并将 DerivedParameterType 替换为 double,则一切编译正常。

有什么想法吗?

【问题讨论】:

    标签: c++ templates g++ mcmc


    【解决方案1】:

    GibbsStep 是一个模板类,在您使用 public Step&lt;GibbsStep&gt; 时需要实例化。你应该把它改成public Step&lt;GibbsStep&lt;DerivedParameterType&gt; &gt;

    【讨论】:

    • 小修正:GibbsStep 是类模板而不是模板类 ;)
    【解决方案2】:

    Naveen 是对的,但您在这里展示的并不是 Barton-Nackman 的把戏。这就是 CRTP(Curiously Recurring Template Pattern)。你可以在这里阅读:

    http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Curiously_Recurring_Template_Pattern

    Burton-Nackman 技巧处理受限制的模板扩展,并被模板专业化语义所取代。您可以在此处阅读更多信息:

    http://en.wikipedia.org/wiki/Barton-Nackman_trick

    致以诚挚的问候, 风向标

    【讨论】:

    • re “……被模板专业化语义所取代”——不完全。仍然有一些用途,例如在维基百科文章中所示。 C++0x 中的概念图最终将取代这种 Barton-Nackmann 技巧的使用。
    • 是的,我知道,我不想让帖子过于复杂。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-20
    • 1970-01-01
    • 2010-11-20
    • 1970-01-01
    相关资源
    最近更新 更多