簡體   English   中英

通過傳遞const char *隱式選擇字符串模板

[英]Select string template implicitly by passing const char*

假設我有自定義字符串類:

class my_string : public std::string
{
    // ...
}

我想創建一個模板化的函數,默認情況下接受my_string

template <typename TString = my_string>
TString do_something(const TString& input)
{
    // ...
}

但當我打電話給:

auto result = do_something("abcdef");

它調用(當然) do_something<char[7]>() 如何強制它調用do_something<my_string> 而不顯式指定類型(即寫do_something("abcdef") ,而不是do_something<my_string>("abcdef") )?

對“從字符串參數構造”進行了細化。

template <typename TString = my_string,
typename std::enable_if<std::is_base_of<std::string, TString>::value>::type = nullptr>
TString do_something(const TString& input)
{
    // ...
}

template <typename ...Args,
typename std::enable_if<std::is_constructible<my_string, Args....>::value>::type = nullptr>
my_string do_something(Args&&... args)
{
    return do_something<my_string>({args});
}

你真的需要一個功能模板嗎? 簡單的功能:

my_string do_something(my_string const& input) { ... }

解決你的用例。 你可以傳入一個my_string或字符串文字,甚至是一個my_string -init-list ,一切正常。


由於出於其他原因需要模板,因此可以簡單地為const char數組提供重載:

template <class TString>
TString do_something(TString const&) { ... }

template <size_t N>
my_string do_something(const char (&arr)[N]) {
    return do_something(my_string{arr, N-1});
}

注意:沒有理由為模板參數TString提供默認值。 這個默認值無法有意義地使用。

回覆

我想創建一個模板化函數,默認情況下接受my_string

#include <string>

template< class Type >
struct Explicit_t_ { using T = Type; };

template< class Type >
using Explicit_ = typename Explicit_t_<Type>::T;

namespace my {
    struct String: std::string { using std::string::string; };
}  // namespace my

template< class Some_string >
auto do_something( Explicit_<Some_string> const& )
    -> Some_string
{ return "Template func!"; }

auto do_something( my::String const& )
    -> my::String
{ return "my::String!"; }

#include <iostream>
using namespace std;
auto main()
    -> int
{
    cout << do_something( "" ) << endl;       // Output "my::String!"
    cout << do_something<std::string>( "" ) << endl;
}

您可以讓my::String的重載只轉發到函數模板,除非您想要更專業或不同的實現。

暫無
暫無

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

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