C++ 使用auto->;显式实例化函数;脱模法

C++ 使用auto->;显式实例化函数;脱模法,c++,templates,explicit-instantiation,C++,Templates,Explicit Instantiation,我想创建一个模板函数,可以提取结构A的任何属性 这是来源 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); 现在我的问题是如何显式地实例化&A::b和&A::c类型的foo。 我试过很多变体,但

我想创建一个模板函数,可以提取结构A的任何属性

这是来源

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);
现在我的问题是如何显式地实例化&A::b和&A::c类型的foo。 我试过很多变体,但都不管用。我在visual studio 2015

哦,还有一个。我们可以用默认参数设置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);
模板
自动foo(A*str,R getter=&A::b)->decltype(str->*getter);
好了:

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);
模板
自动foo(A*str,R getter=&A::b)->decltype(str->*getter);

是否有任何理由不在
Source.h
中编写
foo
的实现?是的,这就是为什么有明确的实例化存在任何理由不在
Source.h
中编写
foo
的实现?是,这就是为什么有显式实例化orry,但我仍然从main中得到链接错误,我调用auto z=foo(&a,&a::b);及error@Demaunt . 错误具体是什么?1)错误LNK2019未解析的外部符号“结构B&u cdecl foo(结构A,结构B A::)”($foo@PQA@@UB@@@YAAAUB@@@PAUA@@PQ1@U0@@Z) 在函数\u主控制台应用程序2中引用。。。2) 警告C4667'B&foo(A,B A::)':未定义与强制实例化匹配的函数模板可能是Microsoft编译器中的另一个“功能”,我想我已使用完此功能,因为我正在处理的项目依赖于MVSC@Demaunt这个警告非常可疑(也应该是一个硬错误)。您是否确保将显式实例化放在
Source.cpp
中的函数定义之后?很抱歉,我仍然从main获取链接错误,我调用auto z=foo(&a,&a::b);及error@Demaunt . 错误具体是什么?1)错误LNK2019未解析的外部符号“结构B&u cdecl foo(结构A,结构B A::)”($foo@PQA@@UB@@@YAAAUB@@@PAUA@@PQ1@U0@@Z) 在函数\u主控制台应用程序2中引用。。。2) 警告C4667'B&foo(A,B A::)':未定义与强制实例化匹配的函数模板可能是Microsoft编译器中的另一个“功能”,我想我已使用完此功能,因为我正在处理的项目依赖于MVSC@Demaunt这个警告非常可疑(也应该是一个硬错误)。您是否确保将显式实例化放在
Source.cpp
中的函数定义之后?