我們試圖重構我們的代碼,我們想要的改進之一如下:許多函數有許多參數,但其中很多參數共享一個公共子集。所以,我們想創建一個可以將它們分組的結構。問題是一些函數需要一些參數爲const,有些則不是。其中一些函數必須能夠調用提供此參數分組結構的這些函數的子集,但是在以下限制下:被調用函數不能「降級」此結構的常量(請參見下面的示例)。實現此結構的所有必需變體解決了這個問題,但並不優雅。我們正在努力解決辦法之一是使用模板,e.g:函數參數分組和常量
template<class A, class B, class C>
struct my_container
{
A a;
B b;
C c;
};
void foo1(my_container<int, char, float const> & my_cont)
{
}
void foo2(my_container<int const, char, float const> & my_cont)
{
// This should NOT be allowed: we do mind something being const to be treated by the
// called function as non-const.
foo1(my_cont);
}
void foo3(my_container<int, char, float> & my_cont)
{
// This should be allowed: we don't mind something being non-const to be treated by the
// called function as const.
foo2(my_cont);
}
我們的問題是,foo2的要求foo1沒有編譯器抱怨,和我們想的完全相反。這甚至可以用模板來實現嗎?還有其他技術嗎?
在我看來,如果常量單獨變化,也許只是不要試圖對這些論點進行分組。 – visitor
該模板似乎表明您正試圖將三個無關的值混合在一起? - 如果你有一個真正的相關功能類,我不認爲人們通常會試圖使它部分可修改。例如,你不想讓功能只修改Point實例的x座標,而不是y。如果它很重要,我想你會把它們作爲單獨的參數傳遞。 – UncleBens