当函数模板在 class 模板中实例化时?
When function templates are instantiated in a class template?
以下class模板中的函数模板是在什么时候实例化的?
// 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();
}
在自由函数模板中,模板在使用具体类型或显式实例化调用时被实例化。
class 模板是怎么回事?我猜 func2() - func4()
是用显式 class 模板实例化 template class A<int>;
实例化的。或者在第一次函数调用时进行实例化,例如 a1.func2(2.)
?
在 func1()
的情况下,实例化可能会在调用 a1.func1<double>(1.);
时发生,因为这是第一次知道第二个模板参数 T2
?
关于次要问题:
我写 A
或 A<T>
有关系吗?我认为是一样的,但我不确定。
class 模板的方法仅在调用时实例化。为了便于说明,请考虑:
#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
。
并非每个方法都必须有效这一事实非常方便,允许不能支持所有模板要求的类型至少使用模板方法的一个子集。
以下class模板中的函数模板是在什么时候实例化的?
// 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();
}
在自由函数模板中,模板在使用具体类型或显式实例化调用时被实例化。
class 模板是怎么回事?我猜 func2() - func4()
是用显式 class 模板实例化 template class A<int>;
实例化的。或者在第一次函数调用时进行实例化,例如 a1.func2(2.)
?
在 func1()
的情况下,实例化可能会在调用 a1.func1<double>(1.);
时发生,因为这是第一次知道第二个模板参数 T2
?
关于次要问题:
我写 A
或 A<T>
有关系吗?我认为是一样的,但我不确定。
class 模板的方法仅在调用时实例化。为了便于说明,请考虑:
#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
。
并非每个方法都必须有效这一事实非常方便,允许不能支持所有模板要求的类型至少使用模板方法的一个子集。