C ++ определяет, имеет ли тип параметр шаблона - PullRequest
0 голосов
/ 07 февраля 2019

Я хотел бы унифицировать интерфейс для работы как с шаблонами, так и без шаблонов.Есть ли способ определить, зависит ли тип, такой как класс или указатель функции от параметра шаблона?

Например:

struct foo {};
template<typename T>  struct bar {};

// This works if the template parameter is provided
template<typename> struct is_templated : false_type {};
template<template<typename...> class Obj, typename...Args>
struct is_templated<Obj<Args...>> : true_type {};
template<typename T> constexpr auto is_templated_v = is_templated<T>::value;

В этом случае is_template_v<foo> ложно, а is_template_v<bar<int>> верно, но я не могу просто вывести что-либо с помощью is_template_v<bar>.В качестве альтернативы, если я определю

template<template<typename...> class> 
struct temp_check : true_type {};

, тогда temp_check<bar> совершенно допустимо, но я не знаю, как я бы аналогично проверил foo.Что нужно, это что-то вроде этого, если это действительно C ++

template<template<> class A> struct temp_check<A> : false_type {};

Есть ли какой-нибудь механизм, который мог бы проверить оба?

1 Ответ

0 голосов
/ 07 февраля 2019

Я бы использовал мощность наборов перегрузки:

#include <iostream>
#include <type_traits>

struct foo {};
template<typename T>  struct bar {};

template<template<class ...> class T, class... TArgs>
constexpr bool is_template() { return true; }

template<class T>
constexpr bool is_template() { return false; }

int main()
{
    std::cout << is_template<foo>() << '\n'; // 0
    std::cout << is_template<bar>() << '\n'; // 1
}

Позвольте пользователю: использовать функцию шаблона для предоставления признака;)

...