Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用泛型私有成员设计模板类_C++_Templates_Type Inference - Fatal编程技术网

C++ 使用泛型私有成员设计模板类

C++ 使用泛型私有成员设计模板类,c++,templates,type-inference,C++,Templates,Type Inference,我想其他人以前也遇到过这个设计问题,所以我希望有人能给我一些建议:我有一个类,应该包含一个私有泛型对象。据我所知,如果不把整个类作为模板,我是无法逃脱的。好的但是现在,是否有任何方法可以在构造期间从构造函数参数推断基础对象的类型,而无需显式指定它(我想在实例化Test类时省略模板参数Derived): #包括 样板 类泛型 { }; 派生类:公共泛型 { 公众: 派生(); intgetfoo(); 私人: 林文福,; }; 样板 课堂测试 { 公众: 测试(T和基础); 私人: T m_基础;

我想其他人以前也遇到过这个设计问题,所以我希望有人能给我一些建议:我有一个类,应该包含一个私有泛型对象。据我所知,如果不把整个类作为模板,我是无法逃脱的。好的但是现在,是否有任何方法可以在构造期间从构造函数参数推断基础对象的类型,而无需显式指定它(我想在实例化
Test
类时省略模板参数
Derived
):

#包括
样板
类泛型
{
};
派生类:公共泛型
{
公众:
派生();
intgetfoo();
私人:
林文福,;
};
样板
课堂测试
{
公众:
测试(T和基础);
私人:
T m_基础;
};
派生的::派生的()
{
这->m_foo=666;
}
int派生::GetFoo()
{
返回此->m_foo;
}
样板
测试::测试(T和底层):m_底层(底层)
{

std::cout m_undernative.GetFoo()通常您有一个类模板和一个类型推断函数模板:

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

template <typename T>
Foo<T> make_foo(T const & t)
{
    return Foo<T>(t);
}
模板
结构Foo
{
Foo(T const&);
};
样板
富美福(施工及测试)
{
返回Foo(t);
}
用法:

auto foo = make_foo(1728);   // makes a Foo<int>
auto-foo=make_-foo(1728);//制作一个foo

这一思想在标准库中被无数次使用(例如
make\u pair
make\u tuple
make\u 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;
}
模板
测试制作测试(T和基础)
{
回归测试(基础);
}
int main()
{
衍生基础;
自动测试=进行测试(基础);
返回0;
}

如果我能帮助它,我宁愿不要在这一点上加劲。我是说,我是不是从C++中要求太多了?我不想争论,但是,对增强的恐惧是不健康的。哈哈。“任何”…明白了吗?@KerrekSB非常有趣,先生:)好吧,说真的,像
boost::any
这样的类可以用大约十行来编写,所以对这个想法闭口不谈确实对你不利。你总是可以在“仿佛boost”下滚动你自己的代码规则,当然,但是Boost中有一些有用的想法。谢谢。太糟糕了,我不能直接使用类构造函数:(
template <typename T> 
Test<T> make_test(T& underlying)
{
    return Test<T>(underlying);
}

int main ()
{
    Derived underlying;
    auto test = make_test(underlying);

    return 0;
}