从非类型模板参数确定类型

时间:2017-01-11 19:32:05

标签: c++ templates member-function-pointers

我希望我能做到这一点:

template <typename T x>
struct Test {
    T val{x};
};

int main() {
    Test<3> test;
    return test.val;
}

But I can't. Right?

我正在回答问题here,我使用以下模板:

template <typename T, typename V, typename VP, V(T::*getf)(), void (T::*setf)(VP)>

手动指定每种类型。但这是一个重复,因为TVVP已经包含在指向成员函数getfsetf类型的指针中。

但是,如果我尝试仅使用

的模板
template <V(T::*getf)(), void (T::*setf)(VP)>

template <V(T::*getf)(), void (T::*setf)(VP), typename T, typename V, typename VP>

然后无法确定类型。

接下来我尝试了专业化:

template <typename T, typename T2>
struct Accessor;

template <typename V, typename T, typename VP>
struct Accessor <V(T::*)(), void (T::*)(VP)>

如果使用

,将确定所有类型
typedef Accessor<
    decltype(&TargetClass::GetFoo), 
    decltype(&TargetClass::SetFoo)> fooAcessor;

但现在我不再有指针,只有类型。

有没有办法编写模板,以便可以从非类型模板参数自动确定类型?

1 个答案:

答案 0 :(得分:12)

  

有没有办法编写模板,以便可以从非类型模板参数自动确定类型?

在C ++ 17中,是的,感谢declaring non-type template parameters with auto

template <auto x>
struct Test {
    decltype(x) val{x};
};

在C ++之前17,没有。你必须写:

template <class T, T x>
struct Test {
    T val{x};
};