2016-05-15 49 views
4

考慮代碼:是否可以顯式指定模板參數來調用模板轉換運算符?

#include <string> 
#include <sstream> 

template <class T> 
struct converter_impl { 
    std::string to_convert; 
    operator T() { 
     T result; 
     std::stringstream ss(to_convert); 
     ss >> result; 
     return result; 
    } 
}; 

struct converter { 
    std::string to_convert; 
    template <class T, class CI = converter_impl<T>> 
    operator T() { 
     CI ci = CI{std::move(to_convert)}; 
     return ci; 
    } 
}; 

converter from_string(std::string s) { 
    return converter{std::move(s)}; 
} 

現在我可以如使用from_string功能如下:

string s = "123"; 
int x = from_string(s); 
cout << x << endl; 

我只是好奇,如果有一種方法調用converter結構明確指定模板參數的類型轉換操作符。語法:

from_string(s).operator int<int, converter_impl<int>>(); 

不工作...

回答

1

可以調用轉換運算符要麼因爲它不是模板:

int x = from_string(s).operator int(); 

或類似這樣的

int x = from_string(s).template operator int(); 

由於變通辦法明確指定第二個模板參數:

struct converter { 
    std::string to_convert; 
    template <class T, class CI > 
    operator T() { 
     CI ci = CI{std::move(to_convert)}; 
     return ci; 
    } 

    template <class T, class CI> 
    T cast() 
    { 
     CI ci = CI{std::move(to_convert)}; 
     return ci; 
    } 
}; 

,並使用它像這樣:

auto y = from_string(s).cast<int, converter_impl<int> >(); 
+0

所以沒有辦法通過有第二個模板參數,這可能是有趣的...? –

+1

作爲解決方案,您可以將模板化函數'cast'添加到'struct converter'中。然後,當隱式轉換可能調用'operator T'時,當你需要明確投射時,你可以調用你的temlate函數。 – user2807083

+0

好主意!謝謝! –

相關問題