c++ - 如何更改模板实例化顺序?

标签 c++ templates inheritance instantiation generic-programming

我想更改重载模板的实例化顺序。我的代码如下:

#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"; }

Demo

关于c++ - 如何更改模板实例化顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36650107/

相关文章:

带约束的 C# 模板

templates - 为什么 Kendo-UI 模板没有输出?

sql - 具有继承性的 PostgreSQL 外键

c++ - .txt 到 vector<struct> 故障

C++ 枚举复制构造函数和赋值运算符

c++ - 嵌套模板(即模板 <typename T< typename templateArgumentFor_T >>)

C++:如何防止破坏参数中构造的对象?

c++ - std::move 的用法

c++ - 向给定 remote_endpoint 对象和套接字的客户端发送数据包?

c++ - 向下转换 C++ 时的不正确行为