我有以下模板化的合并排序程式:
#include <iostream>/span>
#include <vector>
#include <string>
//試圖創建一個默認的方法呼叫。
class CInstance {
private:
std::string str_;
public:
CInstance(const std::string& str) : str_(str) {}.
bool const operator> (const CInstance& that){ return (this-> str_. size() > that.str_.size());};};return(this-> str_.
};
template<class T>
class CObj {
private:
T val;
public:
CObj(const T n) : val(n) {}.
T Get() { return val; }; }; }; }
};
template<class T>
using vcobj = std::vector<CObj<T> >。
template<class T>
void display(vcobj<T>& v){
for (auto & i : v) {
std::cout << i.Get() << " "/span>;
}
std::cout << "
"。
}
template<class T>
vcobj<T> 合并(vcobj<T>& lv, vcobj<T> & rv){
vcobj<T> ret;
auto lsize = lv.size()。
auto rsize = rv.size()。
unsigned int lpin = 0,
rpin = 0;
while(lpin < lsize && rpin < rsize) {
if(lv.at(lpin).Get() > rv. at(rpin).Get()) {
ret.emplace_back(rv.at(rpin).Get() )。
rpin 。
}
else {
ret.emplace_back(lv.at(lpin).Get()。
lpin 。
}
}
for (auto i=lpin; i<lsize; i ) {
ret.emplace_back(lv.at(i).Get()。
}
for (auto i=rpin; i<rsize; i ) {
ret.emplace_back(rv.at(i).Get()。
}
return ret;
}
template<class T>
vcobj<T> Sort(const vcobj<T> & v){
vcobj<T> ret;
auto size = v.size()。
if(size == 0) {
return ret;
}
if(size > 1) {
auto mid = size / 2;
vcobj<T> l(v.begin(), v.begin() mid)。
auto lv = Sort(l)。
vcobj<T> r(v.begin() mid, v.end())。
auto rv = Sort(r)。
ret = Merge(lv, rv);
}
else {
ret = v;
}
return ret;
}
int main() {
{
vcobj<int> v = {4, 5, 2, 1, 9, 6, 10, 8, 15, 3, 7}。
display(v);
auto sorted = Sort(v);
display(sorted)。
}
{
vcobj<float> v = {0.01, 0.001, 0。 002, 0.009, 0.010, 0.0003, 0.00001];
display(v);
auto sorted = Sort(v);
display(sorted)。
}
{
vcobj<std:: string> v = {{"pineapple"}, {"jackfruit"}, {"芒果"/span>}, {"蘋果"/span>}, {"香蕉"/span>};
display(v);
auto sorted = Sort(v);
display(sorted)。
}
//造成問題。
{
vcobj<CInstance> v = {{"pineapple"}, {"jackfruit"}, {"芒果"/span>}, {"蘋果"/span>}, {"香蕉"/span>};
display(v);
auto sorted = Sort(v);
display(sorted)。
}
return 0;
}
在上述所有的型別中,我可以簡單地呼叫物件,它就會提取資料,這看起來就像呼叫一個默認的get()方法。是否有辦法讓CInstance類的物件在單獨使用時觸發一個methos。
舉例來說。 我可以做這樣的事情
CInstance obj;
std::cout << obj;
這將呼叫CInstance中的一個默認方法,它可能是什么。
uj5u.com熱心網友回復:
在這種確切的情況下,你定義一個operator<<方法,像這樣:
std::ostream & operator<<(std::ostream &stream, const CInstance & obj) {
...以你想要的方式向流輸出obj。比如說
stream << obj.getAge()。
return stream。
uj5u.com熱心網友回復:
正如在另一個答案中已經提到的,你可以創建自己的operator<<函式:
std::ostream & operator<<(std::ostream & stream, const CInstance &obj) {
//stream <<任何你想輸出的東西。
return stream。
}
你也可以定義一個轉換運算子。但是在使用它們之前,你應該三思而行。它們會導致不容易除錯的問題,特別是當explicit被省略的時候。一般來說,你不應該為了記錄/除錯而使用這些。如果你的型別代表一個字串,并且你用它來允許輕松轉換到std::string,那么它可能是好的。
#include <iostream>
#include <string>
class CInstance {
std::string str_ = "test";
public:
explicit operator const std。 :string () const { return str_; }; ; const return STR_;
};
int main() {
CInstance obj;
std::cout << (std::string)obj << std::endl;
return 0;
如果你能保證回傳的const char *的壽命在呼叫后仍然有效,你也可以做一些事情(但我會避免這種解決方案):
#include <iostream>
#include <string>
class CInstance {
std::string str_ = "test";
public:
operator const char *() const { return str_。 c_str(); }; ; return str_.
};
int main() {
CInstance t;
std::cout << t << std::endl;
return 0;
個人而言,我會選擇第一個解決方案。但這真的取決于你是否真的有一個CInstance的字串表示,或者你想以不同的格式顯示一些東西用于除錯目的。然而,我將避免使用最后一個非顯式版本的const char *轉換操作員。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/316142.html
標籤:
