2012-12-07 140 views
0

我有以下的模板类:类模板参数推断与构造

template <typename T> 
struct timer 
{ 
    T period; 

    timer(T p) : 
     period(p) 
    {} 
}; 

初始化它,我需要做的事:

timer<double> t(double(0.0)); 

是可以提高timer的类定义,允许此语法:

timer t(double(0.0)); 

并让编译器推断出double类型从构造函数的参数?

+1

检查出[为什么不从构造函数推断模板参数?](http://stackoverflow.com/questions/984394/why-not-infer-template-parameter-from-constructor)为同一问题 –

回答

3

不,你不能这样做。在这些情况下不会出现类型推断。您可以使用关键字auto和函数模板,使事情变得更容易,但:

template<typename T> 
timer<T> make_timer(T value) { 
    return value; 
} 

// let the compiler deduce double 
auto t = make_timer(0.0); 

注意,这个使用auto关键字只在C++ 11标准有效。

而且,这种具体情况,你可以typedef一个double定时器:

typedef timer<double> timer_d; 

timer_d t(0.0); 

虽然我仍然与第一种解决方案,如果你能使用C++ 11。

3

不,这是不可能的,扣除只适用于功能。通常的解决方案是编写一个make_函数返回一个新的实例。这是C++ 11:

template <typename T> 
timer<T> make_timer(T&& p) { 
    return timer<T>(std::forward<T>(p)); 
} 

auto t = make_timer(0.0); 
相关问题