C ++模板参数,用于引用该模板中定义的类型

时间:2017-01-02 01:21:30

标签: c++ templates

我有一个模板:

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替换。

2 个答案:

答案 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