在类模板中实例化功能模板时?

时间:2020-10-16 11:38:03

标签: c++ templates explicit-instantiation

何时实例化以下类模板中的功能模板?

// a.h

#pragma once

template <typename T>
class A {
public:
    template <typename T2> void func1(T2 t);
    void func2(T t);
    T    func3();
    void func4();

    // SECONDARY ISSUE
    // Is there any difference in writing this:
    A& operator=(A const&) = default;
    // or this:
    A<T>& operator=(A<T> const&) = default;
};

-----------------------------

// a.cpp

#include "a.h"

template <typename T>
template <typename T2>
void A<T>::func1(T2 t)
{
    // do sth
}

template <typename T>
void A<T>::func2(T t)
{
    // do sth
}
 
template <typename T>
T A<T>::func3()
{
    T t;
    // do sth
    return t; 
}

template <typename T>
void A<T>::func4()
{
    T t;
    // do sth with t
}

template class A<int>; // explicit instantiation

-----------------------------

// main.cpp

#include "a.h"

int main()
{
  A<int> a1;
  
  a1.func1<double>(1.);
  a1.func1(1.);
  a1.func2(2);
  a1.func3();
  a1.func4();
}

在自由函数模板中,当使用具体类型或显式实例化调用模板时,将实例化该模板。

类模板是什么情况?我猜func2() - func4()是用显式类模板实例化template class A<int>;实例化的。还是在第一个函数调用时(例如a1.func2(2.)时)实例化?

对于func1(),实例化可能是通过调用a1.func1<double>(1.);进行的,因为这是第一次知道第二个模板参数T2的情况?

关于次要问题: 我写A还是A<T>有关系吗?我认为是相同的,但我不确定。

1 个答案:

答案 0 :(得分:3)

类模板的方法仅在被调用时实例化。为了说明,请考虑:

#include <type_traits>

template <typename T>
struct foo {
    void only_for_int() {
        static_assert(std::is_same<T,int>::value);
    }
};


int main(){
    foo<int> f;
    f.only_for_int();   // OK (T == int)
    foo<double> d;      // OK
    //d.only_for_int(); // ERROR: static assert failed
}

创建一个foo<double>很好。您只是无法调用其方法only_for_int。 并非每种方法都必须有效的事实非常方便,可以允许不能支持所有模板要求的类型使用至少一部分模板方法。