gpt4 book ai didi

c++ - 从传递给构造函数的参数类型推导可变成员类型

转载 作者:行者123 更新时间:2023-11-28 01:44:05 25 4
gpt4 key购买 nike

我试图从传递给类的构造函数的参数类型中推断出成员变量的类型。该类(一个 PublishSubscribe 类)的构造函数接收两个参数,每个参数代表可变类型(一个可变参数包用于发送,一个用于接收)。

我尝试使用的代码如下:

#include <tuple>

template <typename... Types>
struct TopicTypes {};

TopicTypes<int> type_subscribe_topics;
TopicTypes<int,double> type_publish_topics;

template <typename... TReceives>
class PublishSubscribe
{
public:
template < typename... TReceives, template <typename...> class TR,
typename... TSends, template <typename...> class TS>
PublishSubscribe(const TR<TReceives...>&,
const TS<TSends...>&){}

private:
std::tuple<TReceives...> member_;
};

class UserClass : public PublishSubscribe{
public:
UserClass()
: PublishSubscribe(
type_subscribe_topics,
type_publish_topics
){}
};

int main()
{
return 0;
}

我收到以下编译错误:

variadic3.cpp:13:17: error: declaration of 'class ... TReceives'
template < typename... TReceives, template <typename...> class TR,
^
variadic3.cpp:9:11: error: shadows template parm 'class ... TReceives'
template <typename ... TReceives>

如何使用类型为 type_subscribe_topics 的 PublishSubscribe 类模板?我需要 PublishSubscribe<magic(decltype(type_subscribe_topics))>默认为 PublishSubscribe<int>在这种特殊情况下..

非常感谢!

最佳答案

您不能在类模板和成员函数模板中使用相同的模板名称。你有

template <typename... TReceives>
class PublishSubscribe

template <  typename... TReceives,  template <typename...> class TR,
typename... TSends, template <typename...> class TS>
PublishSubscribe(const TR<TReceives...>&,
const TS<TSends...>&){}

两者都使用 TReceives。您要么需要更改其中一个模板中的名称,要么,如果您使用的是传递给类的 TReceives,则可以从看起来像这样的函数中删除它

template <                          template <typename...> class TR,
typename... TSends, template <typename...> class TS>
PublishSubscribe(const TR<TReceives...>&,
const TS<TSends...>&){}

您将无法使用构造函数的模板参数来定义 member_ 元组应使用的类型。你可以让这个类不那么笼统,只需要一个像

这样的元组
template <typename T> 
class PublishSubscribe

然后你会像这样使用它

PublishSubscribe<decltype(some_tuple)> foo(some_tuple, some_other_tuple); 

member_ 会变成 T member_;

关于c++ - 从传递给构造函数的参数类型推导可变成员类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45938573/

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