2017-06-12 81 views
2

我想知道是否有人有同樣的技巧來找到find_me函數的返回類型,而不改變它的參數。有沒有方法來decltype不可調用函數的結果?

struct Stuck { 
    Stuck() = delete; 
    Stuck(Stuck&&) = delete; 
    Stuck(const Stuck&) = delete; 
    Stuck& operator=(Stuck&&) = delete; 
    Stuck& operator=(const Stuck&) = delete; 
}; 

double find_me(Stuck); 

int main() { 
    // This obviously don't work 
    decltype(find_me(Stuck{})) test1; 
} 

這是一個鏡頭我想:

template<typename T> 
struct ConvertTo { 
    operator T(); 
} 

int main() { 
    decltype(find_me(ConvertTo<Stuck>{})) test1; 
} 

功能find_me超載很多很多次,從來沒有真正實施。我只想知道當函數具有這些形式時是否有辦法找到返回類型。我知道有可能收到一個指針或引用,這是我已經做的,但我想知道是否還有一些技巧可以使這個工作。

如果有,請告訴我,並告訴我爲什麼。

謝謝。

+0

如果它的過載,沒有。 –

+0

@ T.C。謝謝。然後我會繼續使用參考。 –

+0

這個'find_me'函數可能有什麼用途,不管它是按值還是按引用? – Brian

回答

4

這工作:

struct Stuck { 
    Stuck() = delete; 
    Stuck(Stuck&&) = delete; 
    Stuck(const Stuck&) = delete; 
    Stuck& operator=(Stuck&&) = delete; 
    Stuck& operator=(const Stuck&) = delete; 
}; 

double find_me(Stuck); 
void find_me(double); 

template <typename Ret> 
Ret get_stuck_return_type(Ret (*)(Stuck)); 

int main() { 
    decltype(get_stuck_return_type(find_me)) test1; 
} 

Coliru鏈接:http://coliru.stacked-crooked.com/a/7eca81a13fae9de3

之所以當find_me超載這部作品甚至是模板參數推導將嘗試每個超載的find_me。如果扣除只有一次重載成功,那麼將選擇一個用於實例化模板。

我認爲這是一個純粹的學術練習,因爲一個函數根據值構造一個不可構造的類型並不能達到實際的目的。

+0

是的,該函數將有一個目的。我用它來將某種類型映射到另一種類型。該功能從未實現。我在元編程環境中使用它。 –

+2

如果有任何'find_me'是模板,則不起作用。 'template void find_me(double,T);'會殺死它。 –

+0

@ T.C。我同意,我不認爲這個問題有一個通用的解決方案。 OP確實應該重新考慮他的設計目標。 – Brian

0

std::declval的伎倆:

decltype(find_me(std::declval<Stuck>())) test1; 
+2

'使用已刪除的函數'Stuck :: Stuck(Stuck &&)'' –

0

如何讓用戶添加模板專業化?

您的代碼:

template <typename T> 
struct find_me 
{ 
    struct please_add_your_own_find_me {}; 
    using type = please_add_your_own_find_me; 
}; 

客戶端代碼:

template <> 
struct find_me<Stuck> 
{ 
    using type = double; 
}; 

然後:

find_me<Stuck>::value test1; 
相關問題