在我的代碼中,我有一個抽象類和~8個子類。我想問的是,在C 中是否有可能將typename投射出去并回傳呼叫的類?我需要類似于將A<int>分離為A和int。我需要像這樣的東西:
template <typename T>
class Base
{
T資料。
virtual void setData(T p_data)= 0;
virtual ~Base()。
template<class TC<typename TV> >
operator TC<TV> () const
{
TV tmp = (TV) data;
return TC<TV>(tmp)。
}
};
template <typename T>
class A : public Base< T>
{
A(T data)
{
std::cout << data << std::endl;
}
void setData(T p_data) override
{
data = p_data;
}
};
我以前用的是D語言,在D語言中,下面的代碼可以解決這個問題(為了更好地理解我的想法,我把D語言的代碼放在下面):
auto opCast(K, this R)() const
{
static if (is(R ClassType : Root!T, alias Root))
K tmp = cast(K) data;
return new Root!K(tmp)。
else
throw new Exception("ClassType is not equal (T)")。
}
對于C 來說,有什么解決方案嗎?
uj5u.com熱心網友回復:
如果我沒有讀錯你的D代碼,你基本上是:
- 獲取正在轉換的
this物件的ClassType, - 模式匹配,以確保它是一個有1個引數的模板,然后提取該模板的型別,
- 轉換
ClassType物件的ClassType。 - 將
this物件的data成員轉換為一個指定的輸入型別, - 回傳一個新的模板物件,并將指定的型別作為其引數。
在 C 中沒有類似于 ClassType 的東西,所以基類不可能獲得派生物件的型別別,除非你使用 CRTP 來將派生型別作為模板引數傳遞給基類。
然而,你的operator接近于接受任何種類的模板型別進行轉換,你的語法只是有點錯誤。試試這樣的方法:
template <typename T>
class Base
{
public:
T資料。
...
template<template<typename> typename TC, typename TV>。
operator TC<TV>() const
{
TV tmp = (TV) data;
return TC<TV>(tmp)。
}
};
那么像這樣的東西就可以作業了:
A<int> d(7)。
A<float> e=d;
std::cout << e.data << std::endl。
問題是,這個操作器將轉換為任何模板,這些模板需要一個資料可以轉換的引數。 如果你想把operator限制在被轉換的同一模板上,你將需要像這樣的東西:
template < typename T, template<typename> typename Derived>
class Base
{
public:
T資料。
...
template<typename TV>
operator Derived<TV> () const
{
return Derived<TV>(data)。
}
};
template <typename T>
class A : public Base<T, A>
{
typedef Base<T, A> my_base;
public:
A(T p_data)
{
setData(p_data)。
std::cout << my_base::data << std::endl;
}
void setData(T p_data) override
{
my_base::data = p_data;
}
};
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/306738.html
標籤:
