【问题标题】:Same template class with type/non-type parameters? [closed]具有类型/非类型参数的相同模板类? [关闭]
【发布时间】:2014-08-19 17:10:11
【问题描述】:

给定一个模板类myclass,是否有一种棘手的方法可以让用户这样做:

myclass<void> x;
myclass<double> y;
myclass<42> z; // I do not expect the classic hack 
               // myclass<std::integral_constant<int, 42>>

因为在某些情况下,它是有意义的。我的目标是从用户的角度允许这一点,不管(可能)可怕的元编程黑客是否允许它。

注意:如果可能的话,我想要一个没有boost(仅标准库)的解决方案,以正确理解该方法的所有细节。

【问题讨论】:

  • 您可以这样做with function templates,但我怀疑使用类模板是否可行。
  • 从 C++ 的角度来看,这没有任何意义。模板参数要么是类型,要么是值,而不是两者。您将如何在myclass 中准确使用此模板参数?

标签: c++ templates c++11 metaprogramming c++14


【解决方案1】:

类模板参数要么是类型要么是值,所以当直接实例化类时,我想不出一个技巧来处理这两者。函数是另一回事,所以让我们介绍一个 make 函数:

template <typename T> struct myclass {};

template <int V> struct value {}; // helper

template <typename T> myclass<T>        make_myclass() { return myclass<T>(); }
template <int V>      myclass<value<V>> make_myclass() { return myclass<value<V>>(); }

int main(int argc, char** argv)
{
    auto a = make_myclass<void>();
    auto b = make_myclass<double>();
    auto c = make_myclass<42>();
}

够近了吗?

【讨论】:

  • 你不需要 value&lt;V&gt; 普通的 int 就可以了(例如,myclass&lt;int&gt;)。 value 类没用。虽然,并不完全是 OP 想要的。为这个想法 +1。
  • @40two 哎呀,误读了。
  • @40two:我假设 OP 希望为不同的值创建不同的 myclass 实例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-28
  • 1970-01-01
  • 2014-09-16
  • 2019-12-18
相关资源
最近更新 更多