2017-09-08 50 views
1

引入內聯變量模板的最佳方法是什麼,以便它必須專用於自定義類型?例如,如何爲內聯變量模板創建自定義點?

template<typename T> constexpr inline T max_value_v; 

struct S { 
    int m = 0; 
}; 
static_assert(max_value_v<S>.m == 0); 

compiles上GCC。目的是max_value_v<T>只適用於T專用。但max_value_v的聲明也是一個定義(這是默認初始化),所以max_value_v<S>被接受。

有沒有辦法強制S的作者專門max_value_v,以便只給用戶提供目標值max_value_v<S>

+0

請注意,我對我的回答並不滿意。有沒有更簡單的方法來實現這一目標? –

+1

注意:'max_value_v'未初始化值,但默認初始化。 – Rakete1111

+0

修好了,謝謝。 –

回答

1

@ Rakete1111的回答激勵這個解決方案,包括使用刪除無功能禁用主模板:

template<typename T> T deleted_function() = delete; 
template<typename T> constexpr inline T max_value_v = deleted_function<T>(); 

現在,除非max_value_v專用於S,否則它不會編譯,因爲它依賴於刪除的函數deleted_function<S>()

+0

這是迄今爲止我發現的最佳解決方案,但並不完全令人滿意。如果有人能找到更清潔的解決方案,我會樂意接受它。 –

2

有沒有辦法來強制S筆者專門max_value_v因此,只有max_value_v<S>預期值提供給用戶?

它似乎沒有。 S可以默認初始化,所以主模板適用。

什麼是引入內聯變量模板的最佳方式,以便它必須專用於自定義類型?

你可以提供一個類模板作爲定製點:

template<typename T> struct max_value; 
template<typename T> constexpr inline T max_value_v = max_value<T>::value; 

現在,S作者必須以專業max_valuemax_value_v<S>編譯:

template<> 
struct max_value<S> { 
    static constexpr S value { INT_MAX }; 
}; 

static_assert(max_value_v<S>.m == INT_MAX); 
+0

注意:這不再是我的首選解決方案。 –

1

的方式我這是做一個功能,而不是一個變量:

template<typename T> 
constexpr T max_value() = delete; 

現在使用max_valueT,你有專攻max_value

// without this specialization the static_assert would not compile 
template<> 
constexpr S max_value() { 
    return{}; 
} 

static_assert(max_value<S>().m == 0); 
+0

除了'max_value'不是一個可變模板,這是一個非常強大的解決方案。 –