使用通用私有成员设计模板类

Designing template class with generic private member

本文关键字:成员      更新时间:2023-10-16

我想其他人以前遇到过这个设计问题,所以我希望有人能给我一些关于该怎么做的建议:我有一个应该保存私有泛型对象的类。据我所知,如果不将整个班级作为模板,我就无法逃脱。好。但是现在,有没有办法在构造过程中从构造函数参数推断底层对象的类型,而无需显式指定它(我想在实例化 Test 类时省略模板参数 Derived ):

#include <iostream>
template <typename T>
class Generic
{
};
class Derived : public Generic<int>
{
public:
    Derived ();
    int GetFoo ();
private:
    int m_foo;
};
template <typename T>
class Test
{
public:
    Test (T &underlying);
private:
    T m_underlying;
};
Derived::Derived ()
{
    this->m_foo = 666;
}
int Derived::GetFoo ()
{
    return this->m_foo;
}
template<typename T>
Test<T>::Test (T &underlying) : m_underlying(underlying)
{
    std::cout << this->m_underlying.GetFoo() << std::endl;
}
int main ()
{
    Derived underlying;
    Test<Derived> test(underlying);
    return 0;
}
为了实现我

的目标,我应该注意其他设计策略吗?

通常你有一个类模板和一个类型推断函数模板:

template <typename T>
struct Foo
{
    Foo(T const &);
};
template <typename T>
Foo<T> make_foo(T const & t)
{
    return Foo<T>(t);
}

用法:

auto foo = make_foo(1728);   // makes a Foo<int>

这个想法在标准库中被使用了无数次(如make_pairmake_tuplemake_shared)。指导原则是,您最多应该说一次所需的类型名称,如果可以推断出,则根本不说。

只需创建一个函数来创建Test对象:

template <typename T> 
Test<T> make_test(T& underlying)
{
    return Test<T>(underlying);
}
int main ()
{
    Derived underlying;
    auto test = make_test(underlying);
    return 0;
}