我有一个模板:

template<typename T, typename U>
struct TemplateClass {
  class DefaultU {
    T foo;
    /* ... */
  };
  U bar;
  T& baz;
  /* ... */
};

我希望U的默认值为TemplateClass<T>::DefaultU

我可以将DefaultU放在TemplateClass之外,并使其成为模板,但我认为它属于其中。

那可能吗?

当我写完全部内容后,我意识到我要问的含义看起来像这样:
template<typename T>, typename U = TemplateClass<T, TemplateClass<T, TemplateClass<T, ...>::DefaultU>::DefaultU>::DefaultU>
TemplateClass {
  /* ... */
}

但是,也许有一个捷径或解决方法……就像使默认类型成为某种东西(例如void),我可以根据需要检测并替换为DefaultU

最佳答案



没有。



如果void不是U的可接受类型(或者如果void是仅适用于U也为void的特化的有效DefaultU),那么您确实可以将其用作默认值,而不是直接使用U,您可以使用有条件的成员类型别名:

using u_type = typename std::conditional<std::is_void<U>::value, DefaultU, U>::type;

这使您可以在类模板中定义DefaultU

可以使用默认的自定义空“标记”类型来代替void。这使得条件类型稍微复杂一些。

10-04 15:04