如何将多个模板类统一为一个模板

How to induce some template classes being united by one template?

本文关键字:一个      更新时间:2023-10-16

我有一些模板类。它们由一个命名空间统一,实际上它们依赖于彼此的模板参数。

这是使用#define T而不是template的一个很好的观点,并且在所有类中使用,但是这些类的客户端可能想要用不同的T创建一些这样的对,这就是为什么我想使用模板。

但是,如果我只创建两个分离的类与他们自己的分离模板,我有很好的机会,客户端会犯错误,将把不同的值在那里。因此,如果可能的话,我希望避免使用set T,对这样的两个类设置一次set T,并使用两个类的值。

我想创造这样的东西(想象一下):

template<int T>
namespace Sample
{
    struct A
    {
        char _data[T];
    }
    struct B
    {
        void Get(A& a)
        {
            memcpy(b, a._data, T);
        }
        char b[T];
    }
}

所以,有分离的类,但如果一个有参数T = 50,那么其他必须使用相同的参数。最佳解决方案-模板命名空间,但c++没有模板命名空间。

有可能以某种方式做到吗?也许我需要一些图案?

我不想添加这样的东西:

char X1[T1 - T2 + 1];
char X2[T2 - T1 + 1];

在类B中,如果T1 != T2在编译时得到错误,我想找到简单而美观的解决方案,我相信它必须存在:-)

使用嵌套类。将namespace替换为struct

template<int T>
struct Sample {
    struct A {
        char _data[T];
    };
    struct B{
        // ...
    };
    // You can have static methods that operate on types from
    // the same template instance without specifying the type
    static void foo(B& b) {
        A a{0};
        b.Get(a);
    }
};
int main() {
    Sample<2>::A a{0};
    Sample<2>::B b;
    b.Get(a);
}

也许可以删除Sample的构造函数,这样就没有人试图实例化它了

我看不出这有什么问题。由于各自的T参数使用了不同的值,下面的代码已经无法编译:

template <int T>
struct A
{
};
template <int T>
struct B
{
    Get(A<T>& a) {}
};
int main()
{
    A<5> a;
    B<10> b;
    b.Get(a); // cannot convert A<5> to A<10>&
}