如何將此實例作爲參數傳遞給函數?通過函數傳遞未命名的類
class
{
public:
void foo();
} bar;
是否需要命名類?
這是可複製的,因爲我沒有將課程的副本ctor私有。
那麼如果有可能呢?
如何將此實例作爲參數傳遞給函數?通過函數傳遞未命名的類
class
{
public:
void foo();
} bar;
是否需要命名類?
這是可複製的,因爲我沒有將課程的副本ctor私有。
那麼如果有可能呢?
也許這會更好,如果你明確你想要做什麼。你爲什麼要創建一個未命名的類?它是否符合界面?無名類是相當有限的,它們不能被用來作爲函數的參數,它們不能被用作模板類型參數...
現在,如果你是implmenting的接口,那麼你可以通過引用該接口:
class interface {
public:
virtual void f() const = 0;
};
void function(interface const& o)
{
o.f();
}
int main()
{
class : public interface {
public:
virtual void f() const {
std::cout << "bar" << std::endl;
}
} bar;
function(bar); // will printout "bar"
}
注意:對於所有將模板參數視爲選項的答案,未命名的類不能作爲模板類型參數傳遞。
C++ Standard。 14.3。1,第2款規定:
2 A local type, a type with no linkage, an unnamed type or a type compounded from any of these types shall not be used as a template-argument for a template type-parameter.
如果用comeau編譯器測試(該鏈接爲在線試用),你會得到以下錯誤:
error: a template argument may not reference an unnamed type
作爲一個側面說明,科莫編譯器是我所知道的最符合標準的編譯器,除了是我嘗試過的最有幫助的錯誤診斷之外。
注意:Comeau和gcc(g ++ 4.0)給出上面的代碼錯誤。英特爾編譯器(以及來自其他人的意見MSVS 2008)接受使用未命名的類作爲模板參數,違背標準。
是的,您必須命名該類以將其實例傳遞給該函數。由於您沒有提供自己的副本,因此編譯器會自行生成並使用它。
嗯,無名級。
你可以傳遞一個指向它的指針void *。由於您不能通過名稱引用它,因此除了一個實例外,不能調用它的構造函數,複製構造函數或析構函數,因此您無法複製該實例的構造函數,複製構造函數或析構函數。
編輯:你仍然可以將它傳遞給可以複製它的模板函數。
REEDIT:編輯是錯誤的。
當你想將它傳遞給一個函數時,爲什麼要創建一個匿名類?
就明確地聲明類:
class Foo {
// ...
};
void Method(Foo instance);
int main() {
Foo bar;
Method(bar);
}
的第二可能性是使用模板功能,所以編譯器會推斷出類型(請注意,這不是標準的兼容!)
#include <iostream>
using namespace std;
template <typename T>
void SayFoo(T& arg) {
arg.Foo();
}
int main() {
class {
public:
void Foo() { cout << "Hi" << endl; }
} Bar;
Bar.Foo();
SayFoo(Bar);
return 0;
}
複製類沒有問題,因爲編譯器會自動生成複製構造函數,您可以使用類似boost::typeof這樣的工具,以避免顯式引用類型。
BOOST::AUTO(copy, Bar);
另一個問題是使用(相對較慢的)運行時多態(接口/繼承)。
的本地類型,沒有鏈接的類型,未命名類型或複合的類型作爲模板參數給我看一個使用boost :: typeof的例子嗎? BOOST :: AUTO對我說的不多。 新標準還有必要嗎? – 2009-06-13 17:29:23
選項2不是一個選項。從標準14.3.1模板類型參數:'2一個本地類型,一個沒有鏈接的類型,一個未命名的類型或者任何這些類型複合的類型都不能用作模板類型參數的模板參數' – 2009-06-13 17:42:03
不,它不能。 14.3.1模板類型參數:'2不能用作模板類型參數' – 2009-06-13 17:40:34