[英]Function template taking a template non-type template parameter
如何將模板指針作為成員函數?
通過模板化我的意思是事先不知道以下類型:
T
是指向成員的指針的類 R
是返回類型 Args...
是參數 用於說明問題的非工作代碼:
template <???>
void pmf_tparam() {}
// this works, but it's a function parameter, not a template parameter
template <class T, typename R, typename... Args>
void pmf_param(R (T::*pmf)(Args...)) {}
struct A {
void f(int) {}
};
int main() {
pmf_tparam<&A::f>(); // What I'm looking for
pmf_param(&A::f); // This works but that's not what I'm looking for
return 0;
}
是否有可能在C ++ 11中實現所需的行為?
我認為這種符號是不可能的。 建議P0127R1使這種表示法成為可能。 模板將聲明如下:
template <auto P> void pmf_tparam();
// ...
pmf_tparam<&S::member>();
pmf_tparam<&f>();
為非類型參數添加auto
的提議被投票到Oulu的C ++工作文件中,結果被投票成為在Oulu中也導致C ++ 17的CD 。 如果沒有非類型參數的auto
類型,則需要提供指針的類型:
template <typename T, T P> void pmf_tparam();
// ...
pmf_tparam<decltype(&S::member), &S::member>();
pmf_tparam<decltype(&f), &f>();
正如你在功能中沒有真正說過的那樣,最簡單的是:
struct A {
void bar() {
}
};
template <typename T>
void foo() {
// Here T is void (A::*)()
}
int main(void) {
foo<decltype(&A::bar)>();
}
但是,如果您希望簽名被分解,我不確定是否有辦法直接解決這些類型,但是您可以稍微間接...
struct A {
void bar() {
std::cout << "Call A" << std::endl;
}
};
template <typename R, typename C, typename... Args>
struct composer {
using return_type = R;
using class_type = C;
using args_seq = std::tuple<Args...>;
using pf = R (C::*)(Args...);
};
template <typename C, typename C::pf M>
struct foo {
static_assert(std::is_same<C, composer<void, A>>::value, "not fp");
typename C::return_type call(typename C::class_type& inst) {
return (inst.*M)();
}
template <typename... Args>
typename C::return_type call(typename C::class_type& inst, Args&&... args) {
return (inst.*M)(std::forward<Args...>(args...));
}
};
template <class T, typename R, typename... Args>
constexpr auto compute(R (T::*pmf)(Args...)) {
return composer<R, T, Args...>{};
}
int main() {
foo<decltype(compute(&A::bar)), &A::bar> f;
A a;
f.call(a);
}
以上應該做你想做的事......
你能做的是
template <template T, T value>
void pmf_tparam() {}
然后
pmf_tparam<decltype(&A::f), &A::f>();
問題是不知道參數的類型並且想要該類型的模板參數。
使用額外的decltype
(仍然在模板化參數中),這有效:
#include <iostream>
using namespace std;
template <typename T, T ptr>
void foo (){
ptr();
}
void noop() {
cout << "Hello" << endl;
}
int main() {
//Here have to use decltype first
foo<decltype(&noop), noop>();
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.