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