2017-12-17 9 views
2

私はC++ 17を使用していて、このようなコードの何かを書きたいと思い、::バリアント

#include <variant> 
typedef int NewInt; 
int main() { 
    std::variant<NewInt, int> n = 1; 
} 

しかし、それはコンパイルエラー発し、

po.cpp: In function ‘int main()’: 
po.cpp:5:35: error: conversion from ‘int’ to non-scalar type ‘std::variant<int, int>’ requested 
    std::variant<NewInt, int> n = 1; 
          ^

std::variant<NewInt, int>のようなタイプをどのように定義できますか、それとも不可能ですか?

+0

'std :: variant 'があります。このエラーはその原因になります。あなたは 'NewInt'の代わりに他のもので確認できますか?たとえば、 'std :: variant n = 1; – juanchopanza

+3

あなたのアプローチは機能しません。 C++の場合でも、 'void f(int)'と 'void f(NewInt)'が別々のオーバーロードであると思えば、C++の場合でもC++を使う必要はありません。しかし、C++ 17では、 'enum class NewInt:int {};'を '強いint型 'として定義することができます。 –

答えて

9

タイプエイリアスは、新しいタイプではなく、既存のタイプの別の名前です。だから、あなたは2つの整数の変形を持っています。それが許されている間は、あいまいさを明示的に解決する必要があります。

std::variant<NewInt, int> n{ std::in_place_index<0>, 1 }; 

は、上記第一整数部材を構成します(あなたのNewInt):std::variantは、適切なコンストラクタを有します。 2番目の構造を作成したい場合は、それは明らかです。

std::variant<NewInt, int> n{ std::in_place_index<1>, 1 }; 
+0

日付までに、私は 'std :: variant'で同じ型を使うのはまだ実用化されていません...あるいは一種の一貫性の機会を提供するだけですか?実際のユースケースを知っていますか? – WhiZTiM

+1

@WhiZTiM - 同じ種類の番号ではありません。しかし、同じ '' cv-qualifers''と同じタイプです、そうです。私は、同じ正確なタイプを許可することは、正確な目標ではなく、その派生物であると考えています。 – StoryTeller

+0

@StoryTellerいいえ、それは目標でした。集計タイプは、特定の種類の汎用コードと操作のために同じタイプを複数回追加できる必要があります。 – Yakk

関連する問題