要隱藏該接口的用戶實現的細節,以避免廣泛使用的模板化的功能,我認爲以下概念:演員指針到模板類
// data.h
#ifndef DATA_H_
#define DATA_H_
#include <cstddef>
template <size_t N = 0>
class Data
{
public:
const size_t n;
size_t values[N];
Data<N>();
};
#endif // DATA_H_
// data.cpp
#include "data.h"
template <size_t N> Data<N>::Data()
:
n(N),
values()
{
for (size_t i = 0; i < n; ++i)
{
values[i] = i;
}
}
template class Data<1u>;
template class Data<2u>;
// list.h
#ifndef LIST_H_
#define LIST_H_
#include <cstddef>
#include <memory>
class List
{
private:
std::shared_ptr<void> data;
public:
List(const size_t);
void printData() const;
};
#endif // LIST_H_
// list.cpp
#include "list.h"
#include <iostream>
#include <stdexcept>
#include "data.h"
List::List(const size_t n)
:
data()
{
switch (n)
{
case 1u:
data = std::static_pointer_cast<void>(std::make_shared<Data<1u>>());
break;
case 2u:
data = std::static_pointer_cast<void>(std::make_shared<Data<2u>>());
break;
default:
throw std::runtime_error("not instantiated..");
}
}
void List::printData() const
{
auto obj = std::static_pointer_cast<Data<>>(data); // my question is about this
std::cout << obj->n << ": ";
for (size_t i = 0; i < obj->n; ++i)
{
std::cout << obj->values[i] << " ";
}
std::cout << "\n";
}
// main.cpp中
#include "list.h"
int main()
{
for (size_t i = 1; i <= 2; ++i)
{
try
{
List list(i);
list.printData();
}
catch (...)
{
return 1;
}
}
}
我知道,有些人可能認爲這是可怕的設計。請不要在這裏討論這個,除非你有一個很好的選擇。
我的問題是關於行auto obj = std::static_pointer_cast<Data<>>(data);
在List::printData()
。這感覺有點不安全。是否存在保證是否使用了正確的實例? g++-4.6.3
不會對此代碼給出警告,並且它會打印預期值。
我希望你認識到你的數據類中的'const size_t n'是完全不需要的。您將該值作爲模板參數列表的一部分,即**'N' **。 – WhozCraig 2013-03-08 18:01:05
@WhozCraig怎麼樣'obj-> n'?如何用模板參數做到這一點? – stefan 2013-03-08 18:02:16
std :: static_pointer_cast >將始終投射到數據<0> ...是你在問什麼? – 2013-03-08 18:02:24