[英]Can C++11 deduce class type and member type from pointer-to-member template parameter
[英]How can I deduce a template parameter type in C++11?
我正在嘗試編寫一個強制constexpr
評估的函數。 一個模板。 我寫了這個,但它只適用於int
(當心,GCC 會產生遞歸深度錯誤):
#include <iostream>
template<int val>
constexpr int force_constexpr() { return val; }
constexpr int triangle(int n)
{
return n ? n + triangle(n - 1) : 0;
}
int main(void)
{
std::cout << force_constexpr<triangle(0x200)>() << '\n';
}
請注意,這僅用於演示目的; 我知道三角形數可以用(n+1)*n/2
。
然后我嘗試編寫一個通用函數,但是,它不起作用。 這是一個普通的錯誤(並不奇怪,因為它使用T
之前T
定義):
template<T val, typename T = decltype(val)>
constexpr T force_constexpr() { return val; }
就像這樣(這顯然不起作用;它是一個嵌套模板):
template<typename T>
template<T val>
constexpr T force_constexpr() { return val; }
這需要傳遞參數的類型:
template<typename T, T val>
constexpr T force_constexpr() { return val; }
如何在不將類型作為參數傳遞給模板的情況下執行此操作? 或者,換句話說,我如何推導出模板參數類型?
我正在尋找 C++11 解決方案,但歡迎其他標准的解決方案。
您正在 C++17 中尋找auto
模板參數:
#include <iostream>
template<auto T>
auto *singleton()
{
static const decltype(T) solo{T};
return &solo;
}
int main()
{
const int *p=singleton<42>();
std::cout << "The meaning of life: " << *p << std::endl;
return 0;
}
將模板參數指定為auto
,並使用decltype
推斷其類型。
我不相信在 C++17 之前這是可能的,因為這正是將auto
模板參數添加到標准. 在此之前,從概念上講,無法做到這一點。
C++17 引入auto
作為非類型模板參數:
template <auto val>
constexpr auto force_constexpr() { return val; }
之前,你確實屏蔽了
template<typename T, T val>
constexpr T force_constexpr() { return val; }
可以引入 MACRO 來簡化使用:
#define AUTO(v) decltype(v), (v)
進而
std::cout << force_constexpr<AUTO(triangle(0x200))>() << '\n';
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.