2017-02-22 131 views
0

希望你們能幫助您: 我有以下功能應該與特定類型的返回一個對象的Foo,在這種情況下:在我的富推導出非本模板參數

Foo<int,bool> make_my_foo_object() { 
    return make_foo(10); 
} 

I類有:

template <class A, class B> 
    struct Foo { 
    Foo(A aa): a(aa) {} 
    Foo(B bb): b(bb) {} 
    A a; 
    B b; 
    }; 

然後,在我的make_foo功能我:

template<typename A, class B> 
    Foo<A,B> make_foo(A a) { 
     return Foo<A,B>(a); // this should call the Foo(A) ctor 
    }; 

我知道這是不可能的,因爲在這個簡單的實現中沒有辦法可以根據make_foo的返回類型推斷B

在這種情況下沒有太大意義,但是整個想法是處理模板參數,因爲它們被錯過了而無法推導出來。

我想避免的是指定中的類型返回make_foo <int, bool>(10);中的函數。

你們認爲這有可能的解決方法嗎?或者這是一個不行!

任何幫助或信息將不勝感激。 謝謝。

+2

首先,你爲什麼要避免它傳遞這些參數?你有他們在上面的行。我問這是因爲我可以提出解決方案,但如果我不明白你真正的問題,解決方案可能無法幫助你*。那會浪費我的時間(產生一個不能幫助你的解決方案)。你能否描述一個你正試圖解決這個請求的實際問題? – Yakk

+1

你爲什麼不寫'return {10};'。額外的'make_foo'調用如何有用 –

+0

在這個例子中,模板參數很小。真正的例子可能會更棘手,而不僅僅是'make_foo ()'。由於模板參數不能從它們的構造函數中推導出來,所以我需要這個解決方法,因爲它是一個衆所周知的成語,可以解決這個問題。這個問題對我來說很明顯,但問題是如何去(如果可能的話)過去。 如果您需要創建一個包含10種不同類型的元組,您將避免輸入所有類型。 謝謝。 – Olivier

回答

0

如果你唯一擔心的是避免硬編碼類型則params的重複,你可以給他們的名字,像這樣:

template <typename A=int, typename B=bool> 
Foo<A,B> make_my_foo_object() { 
    return make_foo<A,B>(10); 
} 

也就是說,要使用什麼類型的A和B簡單地從移動的決定返回類型返回到模板參數列表。

+0

目前它沒有使用bool參數,而B也沒有參與任何轉換。你什麼意思? – Useless

+0

剛剛刪除了我以前的評論,現在看它更好,但它有道理,但我試圖避免兩件事情,如果您必須編寫自己的'make_my_foo_object'函數,那麼您必須處理模板聲明你的功能,這不是我想要做的。我試圖避免你在你的函數中寫模板簽名。謝謝 – Olivier

+0

_in your function_ - in ** what ** function?在來電者?這並不需要詳細說明這些參數,這就是違約的全部原因。在'make_my_foo_object'中呢?你必須在某個地方指定類型,你之前只有它們在返回類型中。或者你只是想避免輸入'template'關鍵字出於某種原因? – Useless

1
template<class...Ts> 
struct make_something_t { 
    std::tuple<Ts...> data; 
    template<class T, std::size_t...Is> 
    T make(std::index_sequence<Is...>) && { 
    return T(std::get<Is>(std::move(data))...); 
    } 
    template<class T> 
    operator T()&&{ 
    return std::move(*this).template make<T>(std::make_index_sequence<sizeof...(Ts)>{}); 
    } 
}; 
template<class...Ts> 
make_something_t<Ts...> make_something(Ts&&...ts) { 
    return {std::forward_as_tuple(std::forward<Ts>(ts)...)}; 
} 

live example

make_something(args...)不做任何事情。相反,您可以使用它來構建(幾乎)任何東西,並且它使用args...來構建您從中構建的任何類型。

這可能不是一個好主意,但它會根據您構建的對象來推斷出您製作的對象的類型。

1

我想避免的是在返回make_foo(10)中指定類型;在make_my_foo_object函數中。

像這樣的事情可能對你的作品(最小,工作示例的C++ 14):

template <class A, class B> 
struct Foo { 
    Foo(A aa): a(aa) {} 
    Foo(B bb): b(bb) {} 
    A a; 
    B b; 
}; 

template<typename A, class B> 
Foo<A,B> make_foo(A a) { 
    return Foo<A,B>(a); 
} 

struct W { 
    template<typename A, typename B> 
    operator Foo<A, B>() { 
     return make_foo<A, B>(10); 
    } 
}; 

auto make_my_foo_object() { 
    return W{}; 
} 

int main() { 
    Foo<int, bool> foo1 = make_my_foo_object(); 
    Foo<int, char> foo2 = make_my_foo_object(); 
} 

模板參數由目前運營商在推導W

template<typename A, typename B> 
operator Foo<A, B>() { 
    return make_foo<A, B>(10); 
} 

因爲你將它標記爲C++ 14,所以返回類型是允許的,剩下的就是這樣。
按要求(如果我的請求正確)不再有模板參數,也就是說它不是函數模板。