簡體   English   中英

如何隱式轉換模板化的構造函數參數?

[英]How to implicitly cast templated constructor arguments?

我正在使用不同的輸入類型重載模板化類A的構造函數,包括標量和容器類型參數:

template<typename T>
class A {
public:
    A();
    A(T&& _val) { printf("non-template constructor\n");} ;
    template<typename iT> A(const iT& _cont) { printf("template constructor\n");};

};


int main(int argc, char const *argv[]) {


    A<float> foo1(0.9);                     //template constructor
    A<float> foo2((float)0.9);              //no-template constructor 
    A<float> foo3(std::vector<int>(5,8));   //template constructor


    return 0;
}

但是,有沒有辦法在隱式可轉換類型上調用非模板構造函數,例如將double傳遞給構造函數A<float>()

是的,您可以在構造函數模板中添加SFINAE約束:

template<typename iT,
         std::enable_if_t<!std::is_convertible_v<iT&&, T>>* = nullptr>
A(const iT&) { printf("template constructor\n"); }

iT&&可轉換為T ,這會導致推導類型iT替換失敗,從而從重載集中刪除構造函數模板。

(對於用於表示約束的各種庫工具,您需要#include <type_traits> 。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM