2012-02-02 113 views
5

我想通過重載()作爲getter方法爲類添加一些語法糖。但是,getter方法採用非類型模板參數。舉一個簡單的測試用例:我可以將非類型模板參數傳遞給重載操作符嗎?

#include <iostream> 

class Foo 
{ 
public: 
    template <int i> void get() 
    { 
    std::cout << "called get() with " << i << std::endl; 
    } 
    template <int i> void operator()() 
    { 
    std::cout << "called overloaded() with " << i << std::endl; 
    } 
}; 

int main() 
{ 
    Foo foo; 
    foo.get<1>(); 
    foo.get<2>(); 
    foo<3>(); // error: no match for ‘operator<’ in ‘foo < 3’ 
    return 0; 
} 

這編譯和運行,如果foo<3>();被註釋掉預期。 C++語法是否支持我想要做的事情,還是應該放棄並堅持getter的命名方法?

+1

我現在無法證明它,但肯定唯一的辦法是'foo.operator()<3>()',這可能會失敗的目的。 – PlasmaHH 2012-02-02 16:20:07

回答

8

您正在尋找存在語法錯誤,但你不會喜歡它:

foo.operator()<3>(); 

所以,堅持使用命名的功能。

+0

@軌道上的亮度比賽:從不知道 – noisy 2012-02-02 16:26:53

0

你可以通過把模板上的類像這樣管理:

template<int i> 
class Foo 
{ 
    Foo() 
    { 
     std::cout << "called overloaded() with " << i << std::endl; 
    } 

    static void Get() 
    { 
     std::cout << "called get() with " << i << std::endl; 
    } 
}; 

int main() 
{ 
    Foo<1>::Get(); 
    Foo<3>(); 
    return 0; 
} 

然而,有一個小的損失,因爲調用直接()的形式時,你會構造一個Foo對象。

另外,我猜你的現實生活中的代碼在Foo類中有很多其他的東西,所以將模板移動到類中可能是不可接受的(這可能是一個重大的設計更改) 。

編輯:

實際上,因爲有可能已經是,OP是使用美孚的情況下,我的整個的建議是愚蠢的。不打擾。

+0

我完全同意你的看法,將模板移動到課堂上可能是不可接受的。不是因爲完成一項小任務的代價太大,而是因爲它不能完成*任何事情* – 2012-02-02 16:32:15

相關問題