我有一个模板:
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
替换。
答案 0 :(得分:4)
[it] 是否可能 [在该模板的模板参数列表中引用类模板的成员typedef] ?
没有
也许有一个捷径或解决方法...就像制作默认类型一样(例如,无效)
如果void $key = '56b3f127d65445c0cf6ff05f62ffba53';
$format = 'JSON';
$description = 'just for testing';
$paste = 'Just a simple test';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://paste.ee/api");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Expect:"));
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, array(
'key' => $key,
'format' => $format,
'description' => 'just for testing',
'paste' => $paste,
'format' => 'json'
));
不是可接受的类型(或者如果void U
仅适用于U
也无效的专业化),那么你确实可以使用作为默认值,而不是直接使用DefaultU
,您将使用条件成员类型别名:
U
这允许您在类模板中定义using u_type = typename std::conditional<std::is_void<U>::value, DefaultU, U>::type;
。
您可以使用自定义空“tag”类型作为默认值,而不是void。这使得条件类型稍微复杂一些。
答案 1 :(得分:1)
完整地写出user2079303's answer完整性:
template<typename T, typename U_arg = void>
struct TemplateClass {
class DefaultU {
T foo;
/* ... */
};
using U = typename std::conditional<
std::is_void<U_arg>::value,
DefaultU,
U_arg
>::type;
U bar;
T& baz;
/* ... */
};
由此可以明确地TemplateClass<Foo, FooBar>
实例化TemplateClass<Foo>
,或者使用隐式::DefaultU
类来代替FooBar
。