我想要创建能够提取结构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,我们可以看到,在上面的代码块中没有显式实例化,我们会得到链接错误:

//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中。

附言哦,还有一个。我们可以使用默认参数使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);

关于c++ - 使用auto-> decltype方法的函数的显式实例化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48326974/

10-11 18:42