2015-12-08 72 views
0

我想將靜態函數添加到無需先傳遞模板參數即可訪問的模板類中。那可能嗎?模板類中的靜態非模板方法

namespace foo { 
    template <typename T> 
    class bar { 
    public: 
    static void eggs(); 
    }; 
} 

foo::bar<some_t>::eggs(); // works 
foo::bar::eggs(); // does not work 

我想避免移動eggs()foo命名空間或爲它創建一個新的命名空間(如foo::bar_::eggs(),啊)。

回答

4

不。這不是模板類的工作方式。你想要做的事情在C++中是不可能的。

+1

不,你不能這樣做。但是你總是可以使用typedefs縮短名稱。 typedef foo :: bar Tbar; Tbar :: eggs(); –

1

請記住,foo::bar沒有命名任何類型,而只是一個可用於創建其他類型的模板。

除了使用typedefs /類型別名(通過using),您可以爲模板創建一個非模板化的基類,然後將靜態成員放在那裏。如果您使用公共繼承,則更改任何模板化類中的靜態成員都會在其中全部更改。

0

您可以使模板參數爲可選,您可以定義專用模板。就像這樣:

namespace foo { 

template <typename T = void> class bar { 
public: 
    static void eggs() { cout << "First there was the egg" << endl; } 
}; 

template <> class bar<void> { 
public: 
    static void eggs() { 
    cout << "Then there was the chicken... or was it?" << endl; 
    } 
}; 
} 

auto main() -> int { 
    foo::bar<int>::eggs(); // egg 
    foo::bar<>::eggs(); // chicken 

    return 0; 
} 
1

與您的代碼嘗試後:

我想一個靜態函數添加到模板類,而沒有先通過模板參數訪問 。那可能嗎?

namespace foo { 
    template <typename T> 
    class bar { 
    public: 
    static void eggs(); 
    }; 
} 

foo::bar<some_t>::eggs(); // works 
foo::bar::eggs(); // does not work 

我想避免移動蛋()給foo的命名空間或創建 一個新的命名空間爲它(如富::酒吧_ ::雞蛋(),唉)。

我來這的

foo::bar<some_t>::eggs(); // works while 
foo::bar::eggs(); // doesn't 

首先是由於這樣的事實,使用模板的時候,班級內的任何必須是相對於特定對象的結論,甚至如果你不想要這個功能。我甚至嘗試過使用函數指針,並試圖將它們保存到模板類中,但沒有用,我甚至無法編譯。在這種情況下,我看不到很多選擇。有人可能會知道其他一些技巧,但不是從我所能看到的。