从非类型模板参数确定类型
Determine type from non-type template parameter
我希望我能做到这一点:
template <typename T x>
struct Test {
T val{x};
};
int main() {
Test<3> test;
return test.val;
}
But I can't. Right?
我正在回答一个问题 ,我使用了以下模板:
template <typename T, typename V, typename VP, V(T::*getf)(), void (T::*setf)(VP)>
每种类型都是手动指定的。但这是一个重复,因为 T
、V
和 VP
已经包含在指向成员函数 getf
和 setf
类型的指针中。
但是如果我尝试使用只有
的模板
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;
但现在我没有指针了,只有类型。
有没有办法编写模板,以便根据非类型模板参数自动确定类型?
Is there a way to write a template so that the types can be determined automatically from the non-type template parameter?
在 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};
};
我希望我能做到这一点:
template <typename T x>
struct Test {
T val{x};
};
int main() {
Test<3> test;
return test.val;
}
But I can't. Right?
我正在回答一个问题
template <typename T, typename V, typename VP, V(T::*getf)(), void (T::*setf)(VP)>
每种类型都是手动指定的。但这是一个重复,因为 T
、V
和 VP
已经包含在指向成员函数 getf
和 setf
类型的指针中。
但是如果我尝试使用只有
的模板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;
但现在我没有指针了,只有类型。
有没有办法编写模板,以便根据非类型模板参数自动确定类型?
Is there a way to write a template so that the types can be determined automatically from the non-type template parameter?
在 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};
};