我有一個模板,template <typename T> class wrapper
,我想專門基於typename T::context_type
的存在。如果聲明瞭typename T::context_type
,那麼wrapper<T>
實例化的構造函數和賦值運算符重載應接受強制參數typename T::context_type
。此外,wrapper<T>
對象會將「上下文」存儲在成員數據中。如果typename T::context_type
不存在,那麼wrapper<T>
的構造函數和賦值運算符重載只需要少一個參數,並且不會有其他數據成員。是否有可能基於模板類型參數的嵌套typedef的存在來專門化模板定義?
這可能嗎?我可以在不更改config1
,config2
和main()
的定義的情況下編譯以下代碼:
#include <iostream>
template <typename T, bool context_type_defined = true>
class wrapper
{
public:
typedef typename T::context_type context_type;
private:
context_type ctx;
public:
wrapper(context_type ctx_)
: ctx(ctx_)
{
std::cout << "T::context_type exists." << std::endl;
}
};
template <typename T>
class wrapper<T, false>
{
public:
wrapper() {
std::cout << "T::context_type does not exist." << std::endl;
}
};
class config1 {
public:
typedef int context_type;
};
class config2 {
public:
};
int main()
{
wrapper<config1> w1(0);
wrapper<config2> w2;
}
你需要做的像'類型名稱void_ :: type'來確保專業化是有效的*和*第二個參數匹配默認參數'void'。 –
@Luc Danton:我後面的實際想法是,由於SFINAE的緣故,沒有內部'context_type'的類型'T'不會選擇專業化。 –
對於那些沒有嵌套類型的類型來說,特化將是無效的,但是如果'T :: context_type'是'int',那麼特化是'wrappper'並且不匹配主模板'包裝',這就是爲什麼我的意思是「它不匹配」。 –