使用 auto->decltype 方法显式实例化函数
Explicit instantiation of function with auto->decltype approach
我想创建能够提取任何 属性 结构 A 的模板函数。
这里是Source.h
struct B
{
int bbb;
};
struct C
{
double ccc;
};
struct A
{
B b;
C c;
};
template <class R>
auto foo(A* str, R getter) -> decltype(str->*getter);
现在我想对 foo 使用显式实例化方法
来了Source.cpp:
#include "Source.h"
template <class R>
auto foo(A* str, R getter) -> decltype(str->*getter)
{
return str->*getter;
}
如果我们查看 Main.cpp,我们可以看到,如果没有在上面的代码块中显式实例化,我们会得到 link 错误:
//MAIN.cpp
#include "Source.h"
void main()
{
A a;
a.b.bbb = 7;
auto z = foo(&a, &A::b);
}
现在我的问题是如何为 &A::b 和 &A::c 类型显式实例化 foo。
我尝试了很多变体,但没有任何效果。我在 visual studio 2015.
P.S。哦,还有一个。我们可以用默认参数制作 foo 吗?
R = decltype(&A::b)
?
好了:
template B &foo(A*, B A::*);
template C &foo(A*, C A::*);
关于默认参数,您需要类型和值的默认值:
template <class R = B A::*>
auto foo(A* str, R getter = &A::b) -> decltype(str->*getter);
我想创建能够提取任何 属性 结构 A 的模板函数。
这里是Source.h
struct B
{
int bbb;
};
struct C
{
double ccc;
};
struct A
{
B b;
C c;
};
template <class R>
auto foo(A* str, R getter) -> decltype(str->*getter);
现在我想对 foo 使用显式实例化方法
来了Source.cpp:
#include "Source.h"
template <class R>
auto foo(A* str, R getter) -> decltype(str->*getter)
{
return str->*getter;
}
如果我们查看 Main.cpp,我们可以看到,如果没有在上面的代码块中显式实例化,我们会得到 link 错误:
//MAIN.cpp
#include "Source.h"
void main()
{
A a;
a.b.bbb = 7;
auto z = foo(&a, &A::b);
}
现在我的问题是如何为 &A::b 和 &A::c 类型显式实例化 foo。 我尝试了很多变体,但没有任何效果。我在 visual studio 2015.
P.S。哦,还有一个。我们可以用默认参数制作 foo 吗?
R = decltype(&A::b)
?
好了:
template B &foo(A*, B A::*);
template C &foo(A*, C A::*);
关于默认参数,您需要类型和值的默认值:
template <class R = B A::*>
auto foo(A* str, R getter = &A::b) -> decltype(str->*getter);