【问题标题】:Partial template specialization for constructor构造函数的部分模板特化
【发布时间】:2020-05-24 20:22:59
【问题描述】:

我需要一个如下所示的类:

template<typename T, class S, size_t C>
class myClass
{
public:
    myClass(); // Ctor

    /*


    */
private:
S myData;
}

其中 T 是存储数据的类型,S 是容器类型,C 是它的大小。方法不会依赖于容器类型,但我仍然需要正确初始化 S。例如,让 S 为std::vector,我试过了:

template<typename T, size_t C>
myClass<T, std::vector<T>, C>::myClass()
{

}

但我收到E0040 expected identifier 错误。

【问题讨论】:

  • 这能回答你的问题吗? Template class with template container
  • 我不认为你可以通过专门处理这样的类型来定义单个成员......你需要一个模板构造函数或者你需要创建一个专业化myClass.
  • 你不能部分专门化方法/函数。
  • 你会用 C++17 吗?
  • 抱歉,我刚刚注意到您用问题标记了我,我已经看到了答案。享受编码。

标签: c++ templates


【解决方案1】:

你不能部分特化一个方法,你可以部分特化整个类,但需要一些重复。

由于您可以使用 C++17,因此您可以调整实现:

template<typename T, class S, size_t C>
myClass<T, S, C>::myClass()
{
    if constexpr (std::is_same_v<S, std::vector<T>>) {
        // special case
    } else {
        // regular case
    }
}

另一个选项(C++ 17 之前)中的标记 dipatching,其优点是允许成员初始化列表:

template <typename T> struct tag{}; 

template <typename T, class S, size_t C>
class myClass
{
private:
    myClass(tag<std::vector<T>>) : myData(/*special case */) {/* special case */}

    template <typename U>
    myClass(tag<U>) : myData(/*regular case */) {/* regular case */}

public:
    myClass() : myClass(tag<S>{}) {}

private:
    S myData;
};

【讨论】:

  • 虽然你不能特化一个方法,但它可以使用一个特化的类...
  • @Phil1970:C++ 不允许对函数/方法进行部分 特化(函数/方法有重载,类没有)。不过允许完全专业化。
  • 是否有可能以某种方式使其与std::array 一起使用?
  • 是的,template &lt;std::size_t N&gt; myClass(tag&lt;std::array&lt;T, N&gt;&gt;)
  • @Lenassa:按预期工作here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-08
  • 2016-12-04
  • 2011-02-09
  • 2010-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多