//a.h
#define UNUSED __attribute__((unused))
class Factory {public:
// 靜態(tài)成員函數(shù)
static Factory& Instance() {static Factory g_meta_fn_map; //單例模式
return g_meta_fn_map;
}
void Insert(string op_name, Fn fn) {fn_map_.insert({std::move(op_name), std::move(fn)});
}
const Fn& Get(const string& op_name) const {auto it = fn_map_.find(op_name);
return it->second;
}
private:
Factory() = default;
mapfn_map_;
DISABLE_COPY_AND_ASSIGN(Factory);
};
struct OpRegistrar
{OpRegistrar(const char* op_name, Fn function)
{Factory::Instance().Insert(op_name, std::move(function));
}
void Touch() {}
};
#define REGISTER_KERNEL(op_type, function) \
static OpRegistrar registrar_kernel_##op_type(#op_type, function); \
int TouchOpRegistrar_##op_type() \
{ \
registrar_kernel_##op_type.Touch(); \
return 0; \
}
#define USE_OP(op_type) \
extern int TouchOpRegistrar_##op_type(); \
static int use_op_##op_type UNUSED = TouchOpRegistrar_##op_type();
注冊(cè)op//test_op.cc
#include "a.h"
REGISTER_KERNEL(test_op, func);
使用op//use_op.h
#include "a.h"
USE_OP(test_op);
說明我們知道test_op.cc和use_op.h是不同的編譯單元,靜態(tài)變量的初始化順序不能保證,所以為了能夠在use_op的時(shí)候已經(jīng)注冊(cè)好了,
所以必須用函數(shù)調(diào)用來保證初始化順序。
#include#include#include#include "use_op.h"
using namespace std;
int main()
{vectormodel;
model.push_back("conv");
model.push_back("pool");
model.push_back("add");
run(model);
return 0;
}
single.h single.cc//single.h
#ifndef __SINGLE_H_
#define __SINGLE_H_
#include
use_op.h use_op.cc//use_op.h
#ifndef __USE_OP_H_
#define __USE_OP_H_
#include#includevoid run(std::vectormodel);
#endif
//use_op.cc
#include "single.h"
#include "use_op.h"
extern int reg_conv();
static int conv = reg_conv(); //之所以這樣寫是因?yàn)殪o態(tài)全局變量會(huì)在程序開始前初始化,保證了個(gè)這個(gè)函數(shù)一定會(huì)被調(diào)用,也就保證了kernel被注冊(cè)
extern int reg_pool();
static int pool = reg_pool();
extern int reg_add();
static int add = reg_add();
void run(std::vectormodel)
{for(auto x:model)
{auto fn = single_instance()[x];
fn();
}
}
pool.cc#include#include "single.h"
void show_pool()
{std::cout<<"pool_run"< std::cout<<"reg_pool"<
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
本文標(biāo)題:C++注冊(cè)op-創(chuàng)新互聯(lián)
文章轉(zhuǎn)載:http://www.rwnh.cn/article6/dghgog.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、虛擬主機(jī)、App開發(fā)、微信小程序、定制開發(fā)、App設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容