gpt4 book ai didi

c++ - 为指向成员模板参数的指针推导额外模板参数类型的紧凑方法

转载 作者:行者123 更新时间:2023-11-28 04:06:23 34 4
gpt4 key购买 nike

注意:这个问题主要是学术性的。

我们可以使用指向成员的指针作为类模板中的模板参数,但是如果“依赖”类型未知,我们必须将它们全部声明为模板参数。例如:

// Our template operates with a "pointer to member", but it's generic for
// both the type of the member value itself, as well as the owner type of
// which the value is a member.
template <class T, class V, V T::*memptr>
struct Foo {};

在这种情况下,如果模板功能对这些类型具有通用性,我们必须将 TV 作为模板参数。但是,此模板的用法似乎相当冗长:

struct Bar {int a;};
struct Baz {double a;};

int main(int argc, char** argv) {
// The first two parameters "Bar, int" are kinda redundant
Foo<Bar, int, &Bar::a> foo1;
// Same here with Baz, double
Foo<Baz, double, &Baz::a> foo2;
}

特别是模板参数&Bar::a 是一个类型为int &Bar::* 的非类型参数。因此,T=Bar, V=int 似乎很明显。

是否有可以利用的语法、元程序或构造,以便我们可以仅使用 memptr=&Bar::a 实例化模板并允许 T=Bar, V=int 要推导/推断?

理想情况下,我们将简单地实例化模板:

Foo<&Bar::a> foo1;
Foo<&Baz::a> foo2;

但我似乎无法找到实现这一目标的方法。我有一个使用预处理器宏的解决方案:

// This is an ugly metaprogram and macro to shorten-up usages of the template
template <class T, class V>
struct Step2 {
template <V T::*memptr>
struct Step3 {
typedef Foo<T, V, memptr> Type;
};
};

template <class T, class V>
Step2<T, V> step1(V T::*memptr);

#define FOO(T, MEMBER) decltype(step1(&T::MEMBER))::Step3<&T::MEMBER>::Type

可以用作:

int main(int argc, char** argv) {
// It seems that thre should be a more compact way to instantiate this
// template. Indeed the macro does this, but macros are tough because they're
// global names and it can make compiler errors really tough to comprehend.
FOO(Bar, a) foo1;
FOO(Baz, a) foo2;
}

但这似乎不是一个需要预处理器宏作为解决方案的问题。

最佳答案

类似问题: Deducing pointer-to-member template arguments

答案是依靠 C++17 自动魔术:

template <auto p>
struct Foo {};

关于c++ - 为指向成员模板参数的指针推导额外模板参数类型的紧凑方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58654228/

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