decltype
說明符檢查實體的聲明類型或查詢表達式的返回類型,即它做了什麼。
這裏是另一種用法。爲表明decltype
僅用於type任何轉瞬即逝表情
template<typename U >
static typename std::enable_if<std::is_same<U, int>::value, std::uniform_int_distribution <U>>::type
dist(); // NOTE: no function body
template<typename U >
static typename std::enable_if<std::is_same<U, double>::value, std::uniform_real_distribution <U>>::type
dist()
{
//return; // NOTE: no return
}
decltype(dist<T>()) mUniformDistribution;
可能是問題,爲什麼編譯器不抱怨DIST()函數的不完整的在乎呢?我不知道這是爲什麼。
演示的例子
template<typename T >
class Random
{
public:
Random(const T& min, const T& max)
: mUniformDistribution(min, max)
{}
T operator()()
{
return mUniformDistribution(mEngine);
}
private:
std::default_random_engine mEngine{ std::random_device()() };
template<typename U >
static typename std::enable_if<std::is_same<U, int>::value, std::uniform_int_distribution <U>>::type
dist(); // NOTE: no function body
template<typename U >
static typename std::enable_if<std::is_same<U, double>::value, std::uniform_real_distribution <U>>::type
dist()
{
//return; // NOTE: no return
}
decltype(dist<T>()) mUniformDistribution;
};
int main()
{
Random<int> getRandom(0, 9);
for (int i = 0; i<9; ++i)
std::cout << getRandom() << '\n';
}
第二可能性:'decltype'只是* *評估的返回類型。 – Jarod42 2014-12-02 17:18:21
'decltype'實際上不會調用任何東西。它所做的只是確定某個表達式的*類型*,而沒有實際評估表達式*它只是查看錶達式並詢問「如果我確實評估了這個,那麼結果是什麼類型?」這不取決於任何功能或方法的主體,而僅僅是原型。 – cdhowie 2014-12-02 17:20:05