簡體   English   中英

C ++在模板聲明中使用默認值

[英]C++ using default values in template declaration

我有以下代碼...

#include <iostream>

using namespace std;

template<typename R, R V = R()> R X() { return V; }

int main()
{
    cout << boolalpha << X<bool>() << endl;    
    cout << boolalpha << X<bool, true>() << endl;

    cout << X<int>() << endl;
    cout << X<int, 5>() << endl;

    cout << X<void>() << endl;   // compiler error

    return 0;
}

...適用於bool和int情況,但不適用於void情況。 有辦法解決嗎?

我知道這樣的代碼是可以接受的...

void F()
{
    return void();
}

...因此需要以某種方式使該行為脫離模板。

使用std :: enable_if在兩個功能模板之間進行選擇。 現場示例

#include <iostream>
#include <type_traits>
using namespace std;

template<typename R, R V = R()>
typename std::enable_if<!is_same<R, void>::value, R>::type X() { return V; }

template<typename R>
typename std::enable_if<is_same<R, void>::value, R>::type X() { return; }

int main()
{
    cout << boolalpha << X<bool>() << endl;    
    cout << boolalpha << X<bool, true>() << endl;

    cout << X<int>() << endl;
    cout << X<int, 5>() << endl;

    X<void>(); // You can't print `void` with standard iostreams...

    return 0;
}

您可以創建一個無效類型(無),並使用特征類型指定返回類型:

#include <iostream>

struct None {};
// It may not be reasonable o provide the operator:
inline std::ostream& operator << (std::ostream& stream, None) {
    return stream;
}

template<typename R>
struct Traits {
    typedef R return_type;
};

template<>
struct Traits<void> {
    typedef None return_type;
};

template<typename R>
typename Traits<R>::return_type X() { return typename Traits<R>::return_type(); }

template<typename R, typename Traits<R>::return_type V>
typename Traits<R>::return_type X() { return V; }

int main()
{
    std::cout << std::boolalpha << X<bool>() << std::endl;
    std::cout << std::boolalpha << X<bool, true>() << std::endl;

    std::cout << X<int>() << std::endl;
    std::cout << X<int, 5>() << std::endl;

    std::cout << X<void>() << std::endl;

    return 0;
}

此外,函數X分為兩個,以避免默認模板參數出現問題。

暫無
暫無

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

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