c++ - 具有专门构造函数的模板类

标签 c++ templates constructor metaprogramming

考虑以下模板化数组定义的人为示例:

template <typename t, unsigned int n> class TBase
{
protected:
    t m_Data[n];

    //...
};

template <typename t, unsigned int n> class TDerived : public TBase<t, n>
{
    TDerived()
    {
    }
};

我可以特化这种类型来为长度为 2 的数组提供非默认构造函数,如下所示:

template <typename t> class TDerived<t, 2> : public TBase<t, 2>
{
public:
    TDerived(const t& x0, const t& x1)
    {
        m_Data[0] = x0;
        m_Data[1] = x1;
    }
};

int main()
{
    TDerived<float, 2> Array2D_A(2.0f, 3.0f); //uses specialised constructor
    TDerived<float, 3> Array3D_A;             //uses default constructor

    return 0;
}

有没有其他方法可以创建一个类,该类具有在编译时受模板参数约束的不同构造函数选项,而不需要对每个变体进行完整的类特化?

换句话说,有什么方法可以在 TBase 中拥有专门的构造函数吗?类而不需要创建 TDerived 的中间步骤同时保留 TBase 的功能?

最佳答案

我认为从基类派生类与这里的问题无关,这只是一个实现细节。您真正想要的似乎是是否有一种方法可以部分专门化成员函数,例如构造函数。你想要这样的东西吗?

template <typename T, int N> class Foo
{
    Foo(); // general
    template <typename U> Foo<U, 2>(); // specialized, NOT REAL CODE
};

这行不通。你总是必须对整个类(class)进行特化。原因很简单:您必须先了解类的完整类型,才能您甚至知道存在哪些成员函数。考虑以下简单情况:

template <typename  T> class Bar
{
  void somefunction(const T&);
};

template <> class Bar<int>
{
  double baz(char, int);
};

现在Bar<T>::somefunction()取决于 T , 但该函数仅在 T存在不是 int ,因为 Bar<int>是一个完全不同的类。

或者考虑另一个专业 template <> class Bar<double> : public Zip {}; -- 甚至类的多态性在特化中也可能完全不同!

因此,您可以提供特化成员(包括构造函数)新声明的唯一方法是对整个类进行特化。 (您可以专门化现有函数的定义,请参阅@Alf 的回答。)

关于c++ - 具有专门构造函数的模板类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7026475/

相关文章:

c++ - Clang 不会注意到默认模板参数

C++ 可变参数函数模板

java - 如何在Java中创建正确的实例?

c++ - 如何让 OpenCV 成为我的 qt 项目的默认库?

c++ - 将 FROM stderr 重定向到另一个文件描述符

c++ - Boost asio - 同步写入/读取 - 怎么做?

c++ - 为什么 RcppArmadillo 的 fastLmPure 在输出中产生 NA 但 fastLm 没有?

c++ - 从继承自模板的 dll 导出类

java - 重写 Java 中的构造函数

C# - 使用内部构造函数反序列化类