我想更改重载模板的实例化顺序。我的代码如下:
#include <iostream>
#include <vector>
using namespace std;
template<typename T>
struct Base
{
};
template<typename T>
struct Derived:Base<T>
{
};
//template 1
template<typename T1>
void f(Base<T1>& a){
cout<<"in 1\n";
}
//template 2
template<typename T2>
void f(T2 b){
cout<<"in 2\n";
}
int main(){
Derived<int> v1;
f(v1);
}
编译器会默认选择模板 2,但我希望它选择模板 1。
最佳答案
自定义特征
template <typename T> std::true_type derive_from_base_impl(const Base<T>*);
std::false_type derive_from_base_impl(...);
template <typename T>
using derive_from_base = decltype(derive_from_base_impl(std::declval<T*>()));
static_assert(!derive_from_base<int>::value, "");
static_assert(derive_from_base<Derived<int>>::value, "");
SFINAE,你可以做
template<typename T>
void f(Base<T>& a) { std::cout << "in 1\n"; }
template<typename T>
std::enable_if_t<!derive_from_base<T>::value>
f(T b) { std::cout << "in 2\n"; }
关于c++ - 如何更改模板实例化顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36650107/