2017-11-18 3 views
0

のは、私はこのテンプレートパラメータリストに自動回避

template <auto Arg> class X; 

のようなクラステンプレートを持っている。しかし、私は、テンプレートのパラメータリストにMSVC 2017.5、autoを使用していますが、サポートと私は

template <typename T, T Arg> class X; 
を記述する必要がされていないので言ってみましょう

とタイプを明示的にX<int, 5>経由で自動控除を使用する代わりに指定します。さて、テンプレートパラメータリストにautoがないと同じ結果になる方法はありますか?


具体的には、次のような問題があります。

template <typename C, typename T> 
using Func = const T& (C::*)(void) const; 

template <typename C, typename T, Func<C, T> F> 
class X; 

そして、私はこのようなXを使用することができます:私は、可能な場合Yintの明示的なネーミングを避けたいもちろん

class Y { const int &getInt() const; } 

X<Y, int, &Y::getInt> x; 

+0

実際の問題を解決するために自動オプションを使用していますか、実際に自動回避したいですか?あなたが一例として使っただけでは、私には分かりません。 – nyronium

答えて

4

pre-C++ pre-C++ 17は1つしかありません。かなり推奨されていません。プリプロセッサに目を向ける必要があります。それだけが「自動的に型を抽出する」ことができます。

#include <iostream> 

template <typename C, typename T> 
using Func = const T& (C::*)(void) const; 

template<typename PMem, PMem f> class X; 

template <typename C, typename T, Func<C, T> F> 
class X<Func<C, T>, F> {}; 

#define MAKE_X(...) X<decltype(__VA_ARGS__), __VA_ARGS__> 

struct Y { const int &getInt() const; }; 


int main() { 
    MAKE_X(&Y::getInt) x; 
    return 0; 
} 

重要な部分はMAKE_Xです。 decltypeの引数として、同じトークンを発行しますが、それは変更されません。これは自動的に式の型を抽出するためのハックです。

言うまでもなく、適切なautoパラメータの近くにはありません。

+0

ありがとうございます!関数テンプレート 'template constexpr Cヘルパー((C :: *)(const T&))'を定義し、 'stdを使って返す型を抽出するような"ハックな " :: result_of'しかし、コンパイル時定数として 'helper'の関数パラメータを指定することが可能であるかどうか、また戻り値の型を評価するのに役立つことを期待しています。 –

+0

@ M.Winter - あなたはそのように書くことができます。しかし、関数呼び出し式を型に変換するためには、decltypeが必要になります。それは、あまり冗長にしないために、マクロを何らかの方法で使用する可能性が高いでしょう。 – StoryTeller

関連する問題