如何使用模板参数的成员类型?

时间:2017-02-26 14:14:24

标签: c++ templates visual-c++ c++14

我的功能如下:

template<typename T, typename U>
T myfunc(T a, T b) {
    // the type of a.data and b.data is U
    // ...
}

类型TU的示例如下所示:

class ExampleT {
public:
    int data;
};

T是哪个类,其成员名为datadata的类型为U

我的函数必须使用两个类型参数调用:

myfunc<T, U>(...);

但第二个类型参数(U)是第一个类型(T)中data变量的类型。是否可以从模板中删除U并使用decltype检测它?

可以使用所有最新的C ++ 14功能。

1 个答案:

答案 0 :(得分:6)

您可以将其推断为默认模板参数:

template<typename T, typename U = decltype(T::data)>
T myfunc(T a, T b) {
    // the type of a.data and b.data is U
    // ...
}

Demo;或者在函数体内:

template<typename T>
T myfunc(T a, T b) {
    using U = decltype(T::data);
    // ...
}

或使用本地typedef,如Columbo的suggested

struct ExampleT {
    using Type = int;
    Type data;
};

template<typename T, typename U = typename T::Type>
T myfunc(T a, T b) {
    // ...
}