c++ - 使用通用私有(private)成员设计模板类

标签 c++ templates type-inference

我想其他一些人之前也遇到过这个设计问题,所以我希望有人能给我一些建议,告诉我该怎么做:我有一个类应该包含一个私有(private)通用对象。据我所知,如果不将整个类作为模板,我就无法逃脱。美好的。但是现在,有没有什么方法可以在构造函数参数的构造过程中推断出底层对象的类型,而无需显式指定它(我想在实例化 Derived 类时省略模板参数 Test ):

#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)。指导原则是您最多应该说出一次所需的类型名称,如果可以推断则完全不要说。

关于c++ - 使用通用私有(private)成员设计模板类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13404885/

相关文章:

c++ - 为什么 C++11 override 和 final 不是属性?

c++ - ifstream 接受可变文件名吗?

java - 将C++映射转换为Java映射

c++ - 创建指向模板类的指针

c++ - 从封闭的模板类推导返回类型时函数解析失败

c++ - friend 声明声明了一个非模板函数

c++ - 不了解 C++11 类型推断

css - Meteor - 模板 - CSS 样式问题

Scala:reduce 和 Fold 之间函数类型推断的差异 - 可以对此采取措施吗?

haskell - 如何从类型重建 Haskell 表达式