我有以下課程:
class Inject{
template<template <class> class Daemon>
RETURNTYPE register_inj();
}
這個模板函式有許多實作,其中明確指定了模板引數,一個示例回傳一個類ServiceA,該類具有一個模板引數,在這種情況下被選為 class CacheA。規則是模板函式總是有一個模板引數,但該模板引數可以有多個模板模板引數。例如ServiceB<typename A, typename B>
對于serviceA函式模板被實作為:
template<>
auto register_inj<ServiceA<CacheA>>
{ impl... }
我的問題是應該RETURNTYPE在頭檔案中設定什么?
uj5u.com熱心網友回復:
我相信這個問題混合了兩個不同的東西。
函式模板引數的模板引數數量
Daemon與回傳型別無關。事實上,您的特化 forServiceA表明您甚至不需要模板模板引數。ServiceA<CacheA>不是模板 -它是普通型別(恰好是模板的實體化)。因此,您的函式應該簡單地宣告為template <class Daemon> RETURNTYPE register_inj(). 然后它將與ServiceA<CacheA>以及與ServiceB<CacheB,ResolverB>(它們都只是型別)一起作業。如果您在函式體內實體化該模板,則只需要一個模板模板引數。在標頭中,函式回傳型別可以簡單地宣告為
auto. 這有效地宣告了函式具有推導的回傳型別。但是,在定義該函式之前,您將無法使用該函式(每個呼叫站點都需要知道該函式的回傳型別)。因此,您還必須將函式定義行內到您的標題中。如果您想避免這種情況,則必須使用元編程技術顯式撰寫回傳型別,例如如下:
// you need at least a forward definition of your services here,
// as well as the return types
template <typename Cache>
class ServiceA<Cache>;
template <typename Cache, typename Resolver>
class ServiceB<Cache,Resolver>;
class ServiceARegisterResult;
template <typename Resolver>
class ServiceBRegisterResult<Resolver>;
namespace detail {
template <typename Service>
struct register_inj_return_type {};
template <typename Cache>
struct register_inj_return_type<ServiceA<Cache>> : {
using type = ServiceARegisterResult;
};
template <typename Cache, typename Resolver>
struct register_inj_return_type<ServiceB<Cache,Resolver>> : {
using type = ServiceBRegisterResult<Resolver>;
};
}
class Inject{
template<class Daemon>
typename detail::register_inj_return_type<Daemon>::type
register_inj();
};
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/442162.html
