Объявить тип, являющийся другим классом с заданными аргументами конструктора.
От: Brice Tribbiani Россия http://vzaguskin.github.io
Дата: 11.09.17 11:48
Оценка:
Ну, к примеру, нужен мне тип целого числа со значением по дефолту 10.
Нужно, на псевдокоде, следующее:
using int10_t = int(10);

int10_t x; //x is of type int and equals to 10


Как такого достичь? Можно юзать буст, можно c++14.
хотел уже на боковую
папаху снял и сапоги
но в комментариях проснулись
враги
Re: Объявить тип, являющийся другим классом с заданными аргу
От: koenjihyakkei Россия  
Дата: 11.09.17 12:11
Оценка: 4 (1)
Здравствуйте, Brice Tribbiani, Вы писали:

Можно так наверное:

#include <iostream>

using namespace std;

template<typename T, T def_val>
class MyInt
{
    T val = def_val;
public:
    operator T() const
    {
        return val;
    }
};

int main()
{
    using int10_t = MyInt<int, 10>;
    
    int10_t x;
    
    cout<<"x = " << x << endl;
    
    cout<<"x + 100 = " << x + 100 << endl;

    return 0;
}
Отредактировано 11.09.2017 12:12 koenjihyakkei . Предыдущая версия .
Re: Объявить тип, являющийся другим классом с заданными аргументами конструктора
От: Vamp Россия  
Дата: 11.09.17 12:37
Оценка:
std::integral_constant
Да здравствует мыло душистое и веревка пушистая.
Re[2]: Объявить тип, являющийся другим классом с заданными аргументами конструкт
От: Brice Tribbiani Россия http://vzaguskin.github.io
Дата: 11.09.17 12:57
Оценка:
Здравствуйте, Vamp, Вы писали:

V>std::integral_constant


int был для примера, на самом деле нужен более сложный тип.
boost::dynamic_bitset, если быть точным.

И да, я знаю, что есть std::bitset, где параметр длины темплейтный. Но в нем кой-чего другого не хватает.

Решение от koenjihyakkei вроде бы должно подойти. А чисто ради познавательного интереса любопытно, можно ли как то извернуться, если параметров несколько, а нужно указать один?
Ну то-есть, что-то, типа bind, но возвращающий не объект, а тип.

Ну типа:
struct Point()
{
   Point(x,y):_x{x}, y{y}
   int _x, _y;        
}

using zero_x_point = some_magic_bind<point>(x=0);

zero_x_point pt(5); //x=0, y=5
хотел уже на боковую
папаху снял и сапоги
но в комментариях проснулись
враги
Re[3]: Объявить тип, являющийся другим классом с заданными аргументами конструкт
От: Brice Tribbiani Россия http://vzaguskin.github.io
Дата: 11.09.17 13:57
Оценка:
Здравствуйте, Brice Tribbiani, Вы писали:

BT>Решение от koenjihyakkei вроде бы должно подойти. А чисто ради познавательного интереса любопытно, можно ли как то извернуться, если параметров несколько, а нужно указать один?


Хотя не, не подошло.
Но выход нашел — отнаследоваться, и в конструкторе передать все, что надо.
хотел уже на боковую
папаху снял и сапоги
но в комментариях проснулись
враги
Re[3]: Объявить тип, являющийся другим классом с заданными аргументами конструкт
От: rg45 СССР  
Дата: 11.09.17 15:56
Оценка: 4 (1) +1
Здравствуйте, Brice Tribbiani, Вы писали:

BT>int был для примера, на самом деле нужен более сложный тип.

BT>boost::dynamic_bitset, если быть точным.

Так int — не очень удачный пример в данном случае, потому что от него нельзя наследоваться. Для boost::dynamic_bitset решение видится достаточно простым:

template <unsigned V>
class MyBitset : pubilc boost::dynamic_bitset<>
{
public:
  MyBitset() : dynamic_bitset(NumberOfBits<V>::value, V) { }
};


Где NumberOfBits — вспомогательная метафунция, возвращающая количество значимых бит в числе, реализуется не сложно.
--
Справедливость выше закона. А человечность выше справедливости.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.