簡體   English   中英

如何在 C++11 中推導出模板參數類型?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM