我有一个模板:
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。这使得条件类型稍微复杂一些。