gpt4 book ai didi

c++ - 可变参数模板函数,其中返回类型取决于模板参数列表

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:43:14 26 4
gpt4 key购买 nike

我收到“错误的模板参数数量(2,应该是 1)”错误,我无法真正理解。

我有一个类,它为其他想要与之交互的类型提供一些辅助函数,设置第一个模板参数,它们必须同意在创建时自动相互兼容。为了以一种方便、通用的方式做到这一点,我决定使用可变参数模板,它既可以传递构造函数参数,也可以传递要创建的对象类型采用的附加模板参数:

template<typename INTERNAL_TYPE>
class Linker
{
template< template<typename, typename ...> class INPUT_OBJ_TYPE, class ... TEMPLATE_ARGS, class ... CONSTRUCTOR_ARGS >
std::shared_ptr< INPUT_OBJ_TYPE<INTERNAL_TYPE,TEMPLATE_ARGS ...> > getLinked( CONSTRUCTOR_ARGS ... args )
{
std::shared_ptr< INPUT_OBJ_TYPE<INTERNAL_TYPE,TEMPLATE_ARGS ...> > ptr = std::make_shared< INPUT_OBJ_TYPE<INTERNAL_TYPE,TEMPLATE_ARGS ...> >( args... );
return ptr;
}
};

这适用于以下类:

template<typename INTERNAL_TYPE, typename SECOND_TYPE>
class TEST_CLASS_1
{};

也就是说,我可以做到以下几点:

Linker<int> container;
auto test_1 = container.getLinked<TEST_CLASS_1,double>();

然后我尝试对另一个仅基于一个参数进行模板化的类做同样的事情:

template<typename INTERNAL_TYPE>
class TEST_CLASS_2
{};
auto test_2 = container.getLinked<TEST_CLASS_2>();

但是得到上面提到的错误.. 为什么?如果我从函数声明/定义中删除 TEMPLATE_ARGS ,我会考虑为第二个测试编译的代码(虽然第一个测试不再编译)。所以我认为此时的编译器还没有意识到 TEMPLATE_ARGS 在第二次测试中是空的,并且会因为模板参数过多而抛出错误。所以我想我可能需要使用像

这样的尾随返回类型
template< template<typename, typename ...> class INPUT_OBJ_TYPE,
class ... TEMPLATE_ARGS, class ... CONSTRUCTOR_ARGS >
auto getLinked( CONSTRUCTOR_ARGS ... args )
-> std::shared_ptr< INPUT_OBJ_TYPE<TREE_TYPE,TEMPLATE_ARGS ...> >

或使用 decltype 但这也不起作用:

template< template<typename, typename ...> class INPUT_OBJ_TYPE,
class ... TEMPLATE_ARGS, class ... CONSTRUCTOR_ARGS >
auto getLinked( CONSTRUCTOR_ARGS ... args )
->decltype(std::shared_ptr< INPUT_OBJ_TYPE<TREE_TYPE,TEMPLATE_ARGS ...> >())

我对这个问题的看法是否正确?我该如何解决?

非常感谢!

最佳答案

这可能是一个编译器错误。

获得所需内容的一种方法是提供两个函数,一个是您的原始函数,另一个是没有不可推导参数包的函数:

template<typename INTERNAL_TYPE>
struct Linker
{
template<
template<typename, typename ...> class INPUT_OBJ_TYPE,
class ... TEMPLATE_ARGS,
class ... CONSTRUCTOR_ARGS
>
std::shared_ptr<
INPUT_OBJ_TYPE<INTERNAL_TYPE,TEMPLATE_ARGS...>
> getLinked( CONSTRUCTOR_ARGS ... args )
{
std::shared_ptr< INPUT_OBJ_TYPE<INTERNAL_TYPE,TEMPLATE_ARGS...> > ptr =
std::make_shared< INPUT_OBJ_TYPE<INTERNAL_TYPE,TEMPLATE_ARGS...> >( args... );
return ptr;
}

template<
template<typename, typename ...> class INPUT_OBJ_TYPE,
class ... CONSTRUCTOR_ARGS
>
std::shared_ptr<
INPUT_OBJ_TYPE<INTERNAL_TYPE>
> getLinked( CONSTRUCTOR_ARGS ... args )
{
std::shared_ptr< INPUT_OBJ_TYPE<INTERNAL_TYPE> > ptr =
std::make_shared< INPUT_OBJ_TYPE<INTERNAL_TYPE> >( args...);
return ptr;
}
};

关于c++ - 可变参数模板函数,其中返回类型取决于模板参数列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36972055/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com