2013-03-09 69 views
11

考虑一个简单的函数模板:是否有明确说明模板类型的原因?

template <typename T> 
void FunctionTemplate(T t){ 
} 

void MyFunction(){ 
    int a; 
    FunctionTemplate(a); 
    FunctionTemplate<int>(a); 
} 

在第一次调用(FunctionTemplate(a)),编译出哪个提出了一个问题的类型,是否有任何理由,呼吁FunctionTemplate的第二种方式的存在( FunctionTemplate<int>(a))或者我们无法使用第一种方法的任何令人信服的理由?

编辑:我的术语我稍微偏离,所以请根据需要进行编辑。

回答

13

有时候你会想指定模板参数,即使你没有到。假设您的函数采用类型为T的参数,并且您有一个int,但您希望该函数将其作为float。那么你需要明确地说FunctionTemplate<float>(my_int)

也有很多情况下,模板参数不能被推断。考虑以下几点:

template <typename T> 
T FunctionTemplate() { 
    return T(); 
} 

不管你怎么称呼这个,如果你不提供模板参数,的T类型不能自动推断。在这种情况下,简单的原因是调用网站没有提及它期望的返回类型。

对于术语:当您不指定模板参数时,该模板被隐式地实例化;当您指定模板参数时,模板将被显式实例化。

+0

我会选择'FunctionTemplate((float)my_int)'这样简单的单参数函数模板。虽然口味各不相同! – Ajay 2013-03-10 06:11:23

9

假设您想将该函数作为参数传递给另一个方法;

myAlgorithm(myFunction<int>); 

或者假设你想保证一个函数的浮点版本用于速度;

myFunction<float>(2.0); 

(忘了写2.0f是不是现在的问题)

+0

sftrabbit还提出了在他的回答一个很好的例子;当返回类型取决于模板,但没有参数。 – Dave 2013-03-09 19:38:17

7

的使用迫使编译器使用模板函数的特定版本:

template <typename T> 
T func(T x, T y) 
{ 
    // ... 
} 

int main() 
{ 
    int x = 10; 
    float y = 20; 

    func(x, y); //ERROR no matching function for call to 'func(int&, float&)' 

    func<float>(x, y); // OK, Uses float version of func 
}