【问题标题】:Designing template class with generic private member使用通用私有成员设计模板类
【发布时间】:2012-11-15 19:40:57
【问题描述】:

我想其他一些人之前遇到过这个设计问题,所以我希望有人能给我一些建议:我有一个应该包含私有通用对象的类。据我所知,如果不将整个班级都作为模板,我就无法逃脱。美好的。但是现在,有没有办法在构造过程中从构造函数参数推断底层对象的类型,而无需显式指定它(我想在实例化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;
}

为了实现我的目标,我还应该了解其他任何设计策略吗?

【问题讨论】:

  • @KerrekSB 如果我能帮上忙,我现在宁愿不涉及 BOOST……我的意思是,我对 C++ 的要求太高了吗?
  • 我不会争辩,但对 Boost 的 量的恐惧绝不是健康的。哈哈。 “任何”……明白了吗?
  • @KerrekSB 非常有趣,先生 :)
  • 好吧,说真的,像boost::any 这样的类可以写成大约十行,所以关闭自己的想法确实对您不利。当然,您始终可以根据“如同 Boost”规则滚动您自己的代码,但在 Boost 中一些有用的想法。

标签: c++ templates type-inference


【解决方案1】:

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

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)。指导原则是,你应该最多说出一次想要的类型名,如果可以推断,就不要说。

【讨论】:

  • 谢谢。太糟糕了,我将无法直接使用类构造函数:(
【解决方案2】:

只需创建一个函数来创建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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多