[英]C++ template default parameter
我知道簡單的模板和模板專業化是如何工作的,但是對此我感到很困惑。
程序第一行的T t = T()
是什么? 這是默認參數嗎? 以及如何確定程序的輸出?
#include <iostream>
template<class T, T t = T()>
class A
{
private:
template<bool b>
class B
{
public:
static const int m_n = b ? 1 : 0;
};
public:
static const int m_value = B<(t > T())>::m_n - B<(t < T())>::m_n;
};
int main()
{
std::cout << A<int, -9>::m_value
<< A<bool, true>::m_value
<< A<char>::m_value << std::endl;
return 0;
}
這是我試圖理解的有關C ++評估測試的問題。
是。 第二個參數是此模板的默認參數。
如果您知道這一點,則對輸出的確定應該相當簡單。 我將為您做第一個:
A<int, -9>::m_value
int
是用於T
的數據類型,並且int t
值為-9
。
這行:
static const int m_value = B<(t > T())>::m_n - B<(t < T())>::m_n;
以此方式進行評估(其中int()
為零):
static const int m_value = B<(-9 > 0)>::m_n - B<(-9 < 0)>::m_n;
評估結果如下:
static const int m_value = B<false>::m_n - B<true>::m_n;
評估結果如下:
static const int m_value = 0 - 1;
最終評估如下:
static const int m_value = -1;
所以:
std::cout << A<int, -9>::m_value
是相同的:
std::cout << -1
現在嘗試自行解決其余問題。
是的,這是類模板的默認參數的示例。您會發現此示例非常有用https://msdn.microsoft.com/zh-cn/library/bys786s7.aspx
簡而言之,是的,它確實為第二個模板參數提供了默認值。 您會在A<char>::m_value
行中看到T t = T()
的A<char>::m_value
。 由於第二模板參數被初始化為T()
的默認構造T
默認情況下) t
發生在任何類型的你提供作為第一模板參數的默認值。 然后,程序將作為第二個模板參數給出的值與作為第一個模板參數給出的類型的默認值進行比較。 可以將其視為以下函數,如果我理解正確的類,則可以執行相同的操作。
template<class T>
// T t = T() in a function is the same as your T t = T()
// in your template parameters
int f(T t = T())
{
return (T() == t) ? 0 : ((T() < t) ? 1 : -1);
}
用法:
int main(int argc, char *argv[]) {
std::cout << f<int(-9)
<< A<bool>(true)
<< A<char>() << std::endl;
}
該函數返回0,如果t
等於類型的默認值T
,-1,如果t
小於類型的默認值T
,和1如果t
比類型的默認值大T
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.