我正在使用普通指针编程,但我听说像Boost这样的库实现了智能指针.我还看到在Ogre3D渲染引擎中有一个深度使用共享指针.
三者之间究竟有什么区别,我应该坚持使用它们的类型吗?
如果我有模板功能,例如:
template<typename T>
void func(const std::vector<T>& v)
Run Code Online (Sandbox Code Playgroud)
有什么方法可以在函数中确定T是否是指针,或者我是否必须使用另一个模板函数,即:
template<typename T>
void func(const std::vector<T*>& v)
Run Code Online (Sandbox Code Playgroud)
谢谢
假设我有类似的东西:
template <class T>
void do_something(T t){
pass_it_somewhere(t);
t->do_something();
}
Run Code Online (Sandbox Code Playgroud)
现在T允许是指针类型或非指针类型是有用的.函数do_something(...)基本上可以处理指针和非指针,除了t->do_something().对于指针,我需要一个->和非指针,我需要一个.访问成员.
有没有办法让T接受指针和非指针?
我为其值类型定义了一个带有模板的Node类
template<class T>
class Node {
T val;
public:
Node (T & v) : val (v) {}
...
void print() { cout << v << endl; }
}
Run Code Online (Sandbox Code Playgroud)
大多数情况下,感兴趣的节点值将是一个对象类class Foo.在这种情况下,使用Node<Foo *>会更方便.但也可能是节点将保持原始时间int.然后使用Node<int>就足够了.
问题是,根据是否T是指针类型,某些函数可能需要表现不同.例如,print应该cout << *v在何时以及cout << v其他方面.
我试过的是定义两者:
template<class T>
class Node {
T val;
public:
Node (T & v) : val (v) {}
...
void print() { cout << v << endl; }
} …Run Code Online (Sandbox Code Playgroud) 处理某些类型需要使用成员/方法访问的事实的最佳方法是什么.操作员,而其他人使用 - >操作员.
编写代码是最好的.运算符并让调用者包装类型如下面的代码示例所示.
来自C#背景我不习惯这个特殊问题.
#include <iostream>
#include <string>
#include <vector>
#include <memory>
template<class T>
class container{
public:
void add(T element){
elements_.push_back(std::move(element));
}
void process(){
for(auto& a: elements_){
a.print();
}
}
private:
std::vector<T> elements_;
};
class printable{
public:
void print(){
std::cout << "Print\n";
}
};
template<class T>
class printable_forwarder{
public:
printable_forwarder(T element): element_{std::move(element)}{
}
void print(){
element_->print();
}
private:
T element_;
};
int main()
{
container<printable> c1;
c1.add(printable{});
c1.process();
container<printable_forwarder<std::shared_ptr<printable>>> c2;
std::shared_ptr<printable> sp{std::make_shared<printable>()};
c2.add(printable_forwarder<decltype(sp)>{sp});
c2.process();
}
Run Code Online (Sandbox Code Playgroud)
这看起来更好吗?
#include <iostream>
#include …Run Code Online (Sandbox Code Playgroud)