如何知道一个模板类中另一个模板类的类型

时间:2019-04-18 03:02:42

标签: c++ templates

我有一个模板类,如下所示:

template <typename _Tp>
class CLayer{
public:
    void AddLayer(CLayer *_layer);

private:
    _Tp m_data;
    CLayer *m_layer;
};

然后我想将一个双层添加到一个int层。

int main()
{
    CLayer<double> dlayer;
    CLayer<int> ilayer;
    ilayer.AddLayer(dlayer); // this expression is wrong;
                             // here, the AddLayer function is
                             // void CLayer<int>::AddLayer(CLayer<int> *_layer);

    return 0;
}

如何实现。

我知道我可以将类型CLayer<double> *转换为CLayer<int> *,但是以后我会使用数据,我必须知道数据类型是double类型。

2 个答案:

答案 0 :(得分:2)

name injection,因此您的代码是:

template <typename T>
class CLayer
{
public:
    void AddLayer(CLayer<T>* layer);

private:
    T m_data;
    CLayer<T>* m_layer;
};

您必须进行一些更改。可能的解决方案可能是:

template <typename T, typename Next = void>
class CLayer
{
public:
    void AddLayer(Next* layer);

private:
    T m_data;
    Next* m_layer = nullptr;
};

然后

CLayer<double> dlayer;
CLayer<int, CLayer<double>> ilayer;
ilayer.AddLayer(dlayer);

答案 1 :(得分:1)

您不能执行此操作,因为模板类型不是没有模板参数的类型。这意味着public class Sila3bFragment extends Fragment { public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View mView = inflater.inflate(R.layout.fragment_tab2, container, false); final WebView mWb = (WebView) mView.findViewById(R.id.wv_Tab2); mWb.loadUrl("file:///android_asset/web/sila3/pagemaknaC.html"); mWb.getSettings().setJavaScriptEnabled(true); return mView; } } 在您指定其模板参数之前不是可用的类型,不能像您正在使用的那样单独使用。

要在不引入可变参数模板的情况下解决问题,可以使用继承,但这将迫使您仅从类本身内部使用数据(或提供一些技巧性的机制来获取数据),例如:

CLayer