gpt4 book ai didi

c++ - 从另一个参数引用的模板可变参数

转载 作者:太空狗 更新时间:2023-10-29 21:39:22 25 4
gpt4 key购买 nike

我在模板中引用参数的方式上遇到了麻烦(老实说,我强烈怀疑不可能实现我想做的事情)。

它遵循了一个我想做的事情的例子(当然,这在语法上是不合法的,目的是给出目标是什么的想法):

template<class C, Ret(C::*Member)(Params...), typename Ret, typename... Params>
class MyClass { }

换句话说,我想通过同时指定返回值和该方法的参数来引用类的成员。

不幸的是,我看到的唯一方法是像下面这样的方法(好吧,这确实取决于在哪里需要这些类型名,无论如何它可能是一个有意义的例子):

template<typename Ret, typename... Params>
class MyClass {
public:
template<class C, Ret(C::*Member)(Params...)>
MyClass(C *c) { /* do something else and give sense to this class */ }
}

除了上述通过引入模板化构造函数来打破交错的方法之外,还有另一种有效的方法可以通过唯一的类模板签名获得相同的结果吗?

我知道(非常简单)如何在非可变模板的情况下实现这一点(例如,将 Ret 移动到 Member 之前),但是可变模板(Params) 必须放在模板列表的末尾,我不能以任何方式引用它。

最佳答案

根据this question , 一个可行的解决方案可能是依赖于默认值强制的扣除。

例如,下面的代码应该是有效的:

class MyClass {
public:
template <class C, typename R, typename... P, R(C::*M)(P...) = &C::foo>
void bar(C *c) { }
};

我引用了链接问题的一部分(引用本身就是引用,我在循环中):

A template parameter pack of a function template shall not be followed by another template parameter unless that template parameter can be deduced from the parameter-type-list of the function template or has a default argument.

因此,不应允许使用以下代码,即使它使用 GCC 编译也是如此:

class MyClass {
public:
template <class C, typename R, typename... P, R(C::*M)(P...)>
void bar(C *c) { }
};

好吧,这很棘手,不是那么灵活的解决方案,老实说,我很久以前就进行了一些重构,但为了清楚起见,我决定添加一个答案并用一个可编译的片段结束问题。

关于c++ - 从另一个参数引用的模板可变参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33200526/

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